本文主要讲多线程常见的API
Thread类的构造方法
// NoArgsConstructor
Thread()
//传入Runnable实例
Thread(Runnable target)
//传入Runnable实例和线程名称
Thread(Runnable target, String name)
//传入线程名称
Thread(String name)
//传入线程组名称和Runnable实例
Thread(ThreadGroup group, Runnable target)
//传入线程组名称和Runnable实例和线程名称
Thread(ThreadGroup group, Runnable target, String name)
//传入线程组名称和Runnable实例和线程名称和指定的堆栈大小
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
//传入线程组名称和线程名称
Thread(ThreadGroup group, String name)
接下来依次分析构造方法,浏览源码寻找关键信息
图2-1
图2-2
图2-3
图2-4
图2-5
- init()方法会调用重载方法( 图2-2)
- 如果不传入线程组会默认使用parent的线程组( 图2-3)
- 如果不传入线程名称会默认使用
"Thread-" + nextThreadNum()
( 图2-1和2-4) - 如果不传入Runnable实例会默认不执行方法(图2-5)
- 如果不传入stackSize,默认大小是0(图2-1)
Thread类的常用方法
// 创建线程供后面Api使用
Thread thread = new Thread(()->readFromDataBase());
// 使当前线程休眠
Thread.sleep(long millis) throw InterruptedException
// 守护线程:个人理解,例如当建立一个长连接进行心跳检测时,可以将测试心跳的程序置位守护线程,
// 因为在主程序结束之之后,判断心跳不是必要的,也就是当主线程结束之后,守护线程会跟着结束
thread.setDaemon(Boolean b)
// 判断是否为守护线程
thread.isDaemon()
// 设置线程的优先级(Max = 10 , Min = 1)
// 注意设置优先级只是建议程序去优先或延后执行,程序并不一定会根据优先级去执行
thread.setPriority(int i);
// join等待结束方法,意思就是等待线程结束
thread.join()
// interrupt打断方法,必须在捕获到InterruptedException异常是才会打断程序
thread.interrupt()
//stop 停止方法 这个方法是过时的,JDK官方建议不使用,如果需要停止线程,需要使用interrupt()方法
thread.stop()
多线程常见面试题
- voliate关键字:使用这个关键字修饰之后 , 多个线程运行期间会相互可见
- 锁:synchronized可以加再方法上, 也可以作为代码块使用,加在方法上的时候会存在this锁,
其实使用synchronized修饰方法和 synchronized(this){} 代码块的作用是一样的,
这个锁的作用是使程序单通道执行! - sleep() 和wait()区别
1- 它们最大本质的区别是:sleep()不释放同步锁,wait()释放同步锁.
2- sleep()是Thread类的方法,而wait()则是Object的方法.
3- sleep(milliseconds)可以用时间指定来使他自动醒过来,如果想要唤起只能使用interrupt()打断
而wait()想要被唤起,可以使用notify()或者notifyAll()方法唤醒
4- sleep()必须捕获异常,而wait(),notify()和notifyAll()不需要捕获异常