JAVA线程初体验

线程的创建

线程的启动和停止

/**
 * 演员类 继承Thread类
 * @author Administrator
 *
 */
public class Actor extends Thread {
    //每个线程都有一个run方法  我们可以在run方法中来完成我们想要线程完成的任务
    public void run(){
        System.out.println(getName()+"是一个演员");
        
        int count=0;
        System.out.println(getName()+"登台演出"+(++count));
        
        
        System.out.println(getName()+"演出结束");
    }
    public static void main(String[] args){
        Thread actor = new Actor();//创建一个线程
        actor.setName("程咬金");//设置线程名称
        actor.start();//启动线程
    }
}
package com.imooc;
/**
 * 演员类 继承Thread类
 * @author Administrator
 *
 */
public class Actor extends Thread {
    //每个线程都有一个run方法  我们可以在run方法中来完成我们想要线程完成的任务
    public void run(){
        System.out.println(getName()+"是一个演员");
        
        int count=0;
        boolean keepRunning = true;
        //只要keepRunning不为false 那么线程将一直运行
        while(keepRunning)
        {
            System.out.println(getName()+"登台演出"+(++count));
            if(count == 100)
            {
                //当演出场次达到100次的时候 停止演出
                keepRunning =  false;
            }
            //每次出场演出的速度太快 我们可以让演员每演完10场的时候休息1秒
            if(count%10 == 0){
                try {
                    System.out.println("太累了,休息1秒");
                    Thread.sleep(1000);//这里是以毫秒计算的1000等于1秒
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        
        System.out.println(getName()+"演出结束");
    }
    public static void main(String[] args){
        Thread actor = new Actor();//创建一个线程
        actor.setName("Mr.Thread");//设置线程名称
        actor.start();//启动线程
        
        //创建一个新的线程 在构造方法中可以传入线程的名称
        Thread actree = new Thread(new Actree(),"Mr.Runnable");
        actree.start();
    }
}
class Actree implements Runnable
{

    @Override
    public void run() {
        //Runnable中没有getName() 方法  我们可以使用 Thread的currentThread()方法获得当前的线程
        System.out.println(Thread.currentThread().getName()+"是一个演员");
                
        int count=0;
        boolean keepRunning = true;
        //只要keepRunning不为false 那么线程将一直运行
        while(keepRunning)
        {
            //
            System.out.println(Thread.currentThread().getName()+"登台演出"+(++count));
            if(count == 100)
            {
                //当演出场次达到100次的时候 停止演出
                keepRunning =  false;
            }
            //每次出场演出的速度太快 我们可以让演员每演完10场的时候休息1秒
            if(count%10 == 0){
                try {
                    System.out.println("太累了,休息1秒");
                    Thread.sleep(1000);//这里是以毫秒计算的1000等于1秒
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        
        System.out.println(Thread.currentThread().getName()+"演出结束");
    }
    
}

 模拟两只军队在舞台上表演战斗

军队类

public class Army implements Runnable {
    //volatile 是java的关键字  可见性  使得keepRunning可以接受外部线程的赋值
    volatile boolean keepRunning = true;
    @Override
    public void run() {
        while(keepRunning)
        {
            //让军队发起5连攻
            for(int i=0;i<5;i++){
                System.out.println(Thread.currentThread().getName()+"发起进攻【"+i+"】");
                Thread.yield();//yield()方法可以让线程让出处理器时间 和其他的线程共同争夺处理器资源
            }
            
        }
        System.out.println(Thread.currentThread().getName()+"战斗结束");
    }

}

舞台类

/**
 * 舞台类 也是一个线程
 * @author Administrator
 *
 */
public class Stage extends Thread {
    public void run(){
        Army armyTaskSuiJun = new Army();
        Army armyTaskRevolt = new Army();
        
        Thread armySuiJun = new Thread(armyTaskSuiJun,"隋军");
        Thread armyRevolt = new Thread(armyTaskRevolt,"农民起义军");
        
        armySuiJun.start();
        armyRevolt.start();
        
        //让舞台休眠50毫秒  可以让观众安静的观看演出
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        armyTaskSuiJun.keepRunning = false;
        armyTaskRevolt.keepRunning = false;
        
        try {
            armyRevolt.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
    }
    public static void main(String[] args) {
        new Stage().start();
    }

}

 关键先生类

package com.imooc;
/**
 * 关键先生
 * @author Administrator
 *
 */
public class KeyPersonThread extends Thread {
    public void run(){
        System.out.println(getName()+"出场");
        for(int i=1;i<=10;i++){
            System.out.println(getName()+"进攻隋军"+i+"次");
        }
    }
}

舞台类  加入了关键先生代码

package com.imooc;
/**
 * 舞台类 也是一个线程
 * @author Administrator
 *
 */
public class Stage extends Thread {
    public void run(){
        System.out.println("请观看隋唐演义");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
        System.out.println("大幕徐徐拉开......");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
        Army armyTaskSuiJun = new Army();
        Army armyTaskRevolt = new Army();
        
        Thread armySuiJun = new Thread(armyTaskSuiJun,"隋军");
        Thread armyRevolt = new Thread(armyTaskRevolt,"农民起义军");
        
        armySuiJun.start();
        armyRevolt.start();
        
        //让舞台休眠50毫秒  可以让观众安静的观看演出
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("正当双方激战甚酣,半路杀出个程咬金");
        Thread mrCheng = new KeyPersonThread();
        mrCheng.setName("程咬金 ");
        
        System.out.println("程咬金的理想就是结束战斗,使人民安居乐业");
        //正确停止线程的方法 正确的停止线程的方法应该使用停止标志
        armyTaskSuiJun.keepRunning = false;
        armyTaskRevolt.keepRunning = false;
        //stop是错误的 不应该出现我们的代码中 他会使得线程戛然而止 使得线程不能够正常的结束 甚至没有执行完循环 以及程序的清理工作
//        armySuiJun.stop();
//        armyRevolt.stop();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        mrCheng.start();
        //join方法使其他线程等待mrCheng执行完在继续执行
        try {
            mrCheng.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        System.out.println("战争结束,人民安居乐业");
        
        
        
    }
    public static void main(String[] args) {
        new Stage().start();
    }

}
原文地址:https://www.cnblogs.com/mrluotong/p/5947317.html