尚硅谷_每日一考_445

445

1.画图说明线程的生命周期,以及各状态切换使用到的方法等

由于某个方法的调用导致状态的变化

https://blog.csdn.net/pange1991/article/details/53860651

2.同步代码共中涉及到同步监视器共享数据,读谈你对同步监视器和共享数据的理解,以及注意点。

多个线程共同操作的数据称为共享数据。

注意点:

1)一个线程操作该数据时,其他线程不能进行操作,否则可能出现安全问题。应当使用同步代码。

2)同步监视器可以是任何一个类的对象

3)多个线程使用同步的话,得保证所用的同步监视器一样

同步代码块结构:

synchronized(/*同步监视器*/){
    //书写操作共享数据的代码,保证执行时是单线程的
    //不能多也不能少
	
}

同步方法中的同步监视器是谁?

是默认的,但我们要了解到底是谁。
(1)静态同步方法:是当前类本身(就是 类名.class) 加载时还没创建对象
(2)非静态方法:是this

3. sleep()和 wait()的区别

img

https://blog.csdn.net/qq_20009015/article/details/89980966

4.写一个线程安全的懒汉式

public class SingleTon{
	private SingleTon(){}
	private static SingleTon singleTon = null;
	//当调用方法时,才创建单例对象
	public static SingleTon getSingleTon(){
		if(singleTon == null){//第一层检查,检查是否有引用对象,如果一个线程获取了实例,则不需要进入同步代码块中了
			synchronized (SingleTon.class){//第一层锁,保证只有一个线程进入。同步代码块使用的锁是单例的字节码文件对象,且只能用这个锁
		if(singleTon == null){ //第二层检查
			singleTon = new SingleTon();
		}
	}
		return singleTon;
	}
}

5.创建多线程有几种方式

4种

1.继承Thread类

2.实现Runnable接口

3.实现Callable接口

4.线程池:响应速度提高了,提高了资源的重用率,便于管理

// 1. 创建线程池
   // 创建时,通过配置线程池的参数,从而实现自己所需的线程池
   Executor threadPool = new ThreadPoolExecutor(
                                              CORE_POOL_SIZE,
                                              MAXIMUM_POOL_SIZE,
                                              KEEP_ALIVE,
                                              TimeUnit.SECONDS,
                                              sPoolWorkQueue,
                                              sThreadFactory
                                              );
    // 注:在Java中,已内置4种常见线程池,下面会详细说明

// 2. 向线程池提交任务:execute()
    // 说明:传入 Runnable对象
       threadPool.execute(new Runnable() {
            @Override
            public void run() {
                ... // 线程执行任务
            }
        });

// 3. 关闭线程池shutdown() 
  threadPool.shutdown();
  
  // 关闭线程的原理
  // a. 遍历线程池中的所有工作线程
  // b. 逐个调用线程的interrupt()中断线程(注:无法响应中断的任务可能永远无法终止)

  // 也可调用shutdownNow()关闭线程:threadPool.shutdownNow()
  // 二者区别:
  // shutdown:设置 线程池的状态 为 SHUTDOWN,然后中断所有没有正在执行任务的线程
  // shutdownNow:设置 线程池的状态 为 STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表
  // 使用建议:一般调用shutdown()关闭线程池;若任务不一定要执行完,则调用shutdownNow()

参考文章链接:

1.https://blog.csdn.net/u013541140/article/details/95225769

2.https://www.jianshu.com/p/0e4a5e70bf0e

posted @ 2023-03-01 20:58  zWANG1228  阅读(37)  评论(0)    收藏  举报