【java面试经(架构师&设计师)-第7课】JAVA基础之多线程(三)

技术清单

申明:本文属于整理加工原创,部分举证材料来自于网络,仅用于学习参考。

本文主要介绍java多线程相关知识,通过本文讲解,你可以明白:

1、有三个线程T1,T2,T3,怎么确保它们按顺序执行(join())?

2、Java中如何正确地停止和暂停一个线程?interrupted 和 isInterrupted方法的区别?

3、notify 和 notifyAll有什么区别?为什么wait, notify 和 notifyAll这些方法不在thread类里面?

4、Java线程池中submit()和execute()方法有什么区别?

5、实现单例模式的方法有哪些?单例模式的双检锁是什么?饿汉模式与懒汉模式?

技术解析

一、有三个线程T1,T2,T3,怎么确保它们按顺序执行(join())?

在多线程中有多种方法让线程按特定顺序执行,可以用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行。

public class Test {
    public static void main(String[] args) throws InterruptedException{
        Thread t1 =  new Thread() {
            @Override
            public void run() {
                for (int i = 1; i < 10; i++) {
                    System.out.println(i);
 
                }
            }
        };
         
        Thread t2 =  new Thread() {
            @Override
            public void run() {
                for(int i = 10; i < 20;i++) {
                    System.out.println(i);
                }
            }
        };
 
        Thread t3 =  new Thread() {
            @Override
            public void run() {
                for(int i = 20; i < 30; i++) {
                    System.out.println(i);
                }
            }
        };
        t1.start();
        t1.join();
        t2.start();
        t2.join();
        t3.start();
        t3.join();
    }
}

二、Java中如何正确地停止和暂停一个线程?interrupted 和 isInterrupted方法的区别?

停止一个线程可以用Thread.stop()方法,但最好不要用它。虽然它确实可以停止一个正在运行的线程,但是这个方法是不安全的,而且是已被废弃的方法。

1、在java中有以下3种方法可以终止正在运行的线程:

1)使用退出标志,使线程正常退出,也就是当run方法完成后线程终止;

2)使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期作废的方法;

3)使用interrupt方法中断线程。

2、interrupt()方法:

前面两个是判断是否中断的方法,而interrupt()就是真正触发中断的方法。

我们先看下interrupt的定义:

public void interrupt() {
     if (this != Thread.currentThread())
          checkAccess();
     synchronized (blockerLock) {
          Interruptible b = blocker;
          if (b != null) {
              interrupt0();           // Just to set the interrupt flag
              b.interrupt(this);
              return;
          }
     }
     interrupt0();
}

作用是中断线程。将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。线程会不时地检测这个中断标示位,以判断线程是否应该被中断(中断标示值是否为true)。它并不像stop方法那样会中断一个正在运行的线程;

interrupt()方法只是改变中断状态,不会中断一个正在运行的线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值