Java程序员多线程的常用方法(很重要,稍微难理解,我用最清楚的大白话说)

线程等待join()

代码如下:

执行结果如下:

 结论:

优势:

线程的终止

实现方式:

yield让出执行权

代码如下:

执行结果如下:

结论:

找到当前线程Thread.CurrentThread()


  • 线程等待join()

方法说明
join()等待线程结束
join(long millis)等待线程结束,最多等milliis毫秒
join(long millis,int nanos)可以更高精度等待

代码如下:

package thread.threaddemo;

/**
 * @Author: wenjingyuan
 * @Date: 2022/11/07/21:45
 * @Description:关于join的一个实例
 */
public class ThreadByJoin {
    public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(()->{
                //张三上班
                System.out.println("张三上班");
                //张三正在上班
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //张三下班
                System.out.println("张三下班");
            });
        t.start();
        //等待线程t1结束之后,在执行后面的代码
        t.join();
        Thread thread=new Thread(()->{
            //李四上班
            System.out.println("李四上班");
            //李四正在上班
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //李四下班
            System.out.println("李四下班");
        });
        thread.start();
    }
}

执行结果如下:

 结论:

join():等待某个线程执行结束以后在执行后续的代码

优势:

1.相比于我们之前用的isActive()方法判断此时这个线程是否活跃,join()写法比较优雅

2.join()底层的实现是靠wait阻塞线程的执行,wait消耗CPU的资源较少

  • 线程的终止

实现方式:

1)使用自定义的标识符来终止线程

(1)实现代码:

package thread.threaddemo;

/**
 * @Author: wenjingyuan
 * @Date: 2022/11/09/8:53
 * @Description:使用自定义标识符的方式来终止线程
 */
public class ThreadByInterrupt {
    private volatile static  boolean flag=false;
    public static void main(String[] args) throws InterruptedException {
        Thread thread=new Thread(()->{
            while(!flag){
                System.out.println("正在转账...");
                try {
                    Thread.sleep(800);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("还好,差点误了大事");
        });
        thread.start();

        Thread.sleep(1000);
        //终止线程
        System.out.println("有内鬼,终止交易");
        flag=true;
    }
}

执行结果:

 2)使用interrupt()来终止线程

(2)代码如下:

package thread.threaddemo;

/**
 * @Author: wenjingyuan
 * @Date: 2022/11/09/11:09
 * @Description:interrupt()方法
 */
public class ThreadInterrupt2 {
    public static void main(String[] args) throws InterruptedException {
        Thread thread=new Thread(()->{
            while(!Thread.currentThread().isInterrupted()){
         //   while(!Thread.interrupted()){
                System.out.println("正在转账..");
            }
            System.out.println("险些误了大事!");
        });
        thread.start();
        Thread.sleep(1000);
        thread.interrupt();
        System.out.println("有内鬼,终止交易!");
    }
}

执行结果如下:

其中,interrup需要配合Thread.interrupted和Thread.currentThread().isinterrupted进行使用,从而实现线程的终止,那么关于Thread.interrupted和Thread.currentThread().isinterrupted的区别,以下就是他们之间的区别

(1)Thread.interrupted是全局的方法,在使用了一次以后,会清除原来的标识位,是属于静态方法,所有程序都可以直接调用的全局方法

(2)Thread.currentThread().isinterrupted是实例的方法,再进行了设置以后是不会进行改变的。

  • yield让出执行权

代码如下:

package thread.threaddemo;

/**
 * @Author: wenjingyuan
 * @Date: 2022/11/10/16:34
 * @Description:yield让出执行权
 */
public class ThreadDemoYield {
    public static void main(String[] args) {
        Thread thread=new Thread(()->{
            Thread  cThread=Thread.currentThread();
            for (int i = 0; i < 100; i++) {
               Thread.yield();
                System.out.println("执行的线程为:"+cThread.getName());
            }
        },"线程1");
        thread.start();

        Thread thread1=new Thread(()->{
            Thread  cThread=Thread.currentThread();
            for (int i = 0; i < 100; i++) {
                System.out.println("执行的线程为:"+cThread.getName());
            }
        },"线程2");
        thread1.start();
    }
}

执行结果如下:

结论:

yield方法会出让CPU执行权,让线程调度器重新调度线程,但还是有一定的几率再一次调用到出让CPU的线程上的,通过上面的执行结果,我们可以看到,线程1在调用了yield()方法之后 ,并不是说全部都不执行等到线程2结束以后再去执行,但总的来说,线程1因为调用yield()方法,很大一部分可能都是最后才执行结束的。

  • 找到当前线程Thread.CurrentThread()

这个方法我们已经非常熟悉了,在之前的操作里总是会遇见,调用该方法拿到的是当前线程的一个实例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值