Java多线程

目录

 

一.继承Thread类,重写run()+start()

二.实现Runnable接口,重写run()方法

三.juc下Callable接口,重写call()

四.线程状态

1.新生状态:

2.就绪状态:

3.运行状态:

4.阻塞状态:

5.终止状态:

五.线程状态

1.一个线程如何进入到就绪状态:

2.进入阻塞状态的方式:

3.进入终止状态的方式:

注意:


一.继承Thread类,重写run()+start()

注意 继承父类->单继承

run方法不能抛出异常,没有返回值

2.实现Runnable接口,重写run()+start()-->推荐:简单,优点

3.juc包下Callable接口,重写call方法

public class Class001_Thread extends Thread{
    //run()方法中定义线程体
    @Override
    public void run() {
         for(int i = 1;i<=20;i++){
             System.out.println("喝咖啡...");
            /* try {
                 Thread.sleep(2);  //毫秒
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }*/
         }
    }
​
    public static void main(String[] args) {
        //创建线程
        Class001_Thread th = new Class001_Thread();
        //开启线程
        th.start();
        //th.run(); 普通方法的调用,不是线程的开启
        //主线程
        for(int i = 1;i<=20;i++){
            System.out.println("讲课...");
            try {
                Thread.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

二.实现Runnable接口,重写run()方法

优点:

接口可以多实现,类只能单继承 实现资源共享

public class Class004_Thread implements Runnable{
​
    public static void main(String[] args) {
        //真实角色
        Class004_Thread ct = new Class004_Thread();
        //创建一个线程
        //代理角色
        Thread th = new Thread(ct);
        //开启线程
        th.start();
​
      /*
        //真实角色
        Manager manager = new Manager();
        //代理角色
        Hr hr = new Hr(manager);
​
        hr.addUser();*/
​
​
​
        for(int i=0;i<50;i++){
            System.out.println("一边上厕所!!!!");
        }
​
    }
    /*
        定义线程体
        不能抛出异常
        不返回结果
     */
    @Override
    public void run() {
        for(int i=0;i<50;i++){
            System.out.println("一边打游戏!!!");
        }
    }
}

三.juc下Callable接口,重写call()

优点:call方法可以抛出异常可以定义返回值

缺点:使用复杂麻烦

public class Class007_Racer implements Callable<Integer> {
    //胜利者
    private String winner = null;
​
    /*
        参赛者
     */
    @Override
    public Integer call() throws InterruptedException {
        //每一个参赛者都要跑100步结束
        for(int step = 1;step <= 100; step++){
            //判断是否为兔子,并且步数是否为10的倍数
            if("pool-1-thread-1".equals(Thread.currentThread().getName()) && step%10==0){
                Thread.sleep(10);
            }
            System.out.println(Thread.currentThread().getName()+"正在跑第"+step+"步");
            Thread.sleep(2);
​
            //结束的条件判断
            if(checkOver(step)){
                return step;
            }
        }
        return null;
    }
​
    /**
     * 决定线程是否结束
     * @param step 步数
     * @return 当前线程是否结束执行
     *      true->结束执行
     *      false ->继续执行
     */
    public boolean checkOver(int step){
        //是否已经有人赢了
        if(winner!=null){
            return true;
        }
        //当前线程是否赢了
        if(step==100){
            winner = Thread.currentThread().getName();
            return true;
        }
        return false;
    }
​
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //1.创建1场比赛
        Class007_Racer racer = new Class007_Racer();
        //2.
        // 1)创建执行服务
        // 固定大小线程池->2
        ExecutorService server = Executors.newFixedThreadPool(2);
        // 2)提交执行
        Future<Integer> f1 =  server.submit(racer);
        Future<Integer> f2 =  server.submit(racer);
         //3) 获取执行结果
        Integer i1 = f1.get();
        Integer i2 = f2.get();
​
        System.out.println(i1);
        System.out.println(i2);
​
        //3.比赛
        server.shutdown();
    }
}

四.线程状态

1.新生状态:

new Thread(),new的时候就是一个线程进入新生状态

2.就绪状态:

start()一个线程就会进入到就绪状态,进入就绪队列进行等待,可以等待cpu的调度

3.运行状态:

当cpu调用调度到就绪列队中的某一个线程,这个线程开始进入运行状态

4.阻塞状态:

线程无法正常执行,可能会进入到阻塞状态

5.终止状态:

线程执行完毕

五.线程状态

1.一个线程如何进入到就绪状态:

1.start()

2.线程切换:被切换的线程恢复到就绪状态,等待下一次被调用

3.阻塞解除

4.yield()礼让线程

2.进入阻塞状态的方式:

1.sleep()

2.join()

3.wait()

4.IO等

3.进入终止状态的方式:

1.stop()终止方法-->不推荐使用-->比较暴力手法

2.通过添加表示判断

注意:

1.一个线程一旦执行完毕,不能恢复,重新new,也是新的线程

2.阻塞解除无法直接恢复到运行状态,会恢复到就绪状态,等待下一次被cpu调度

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值