在Java多线程中,我们可以通过不同的方式去启动线程,并操作线程,这里最主要是对常用方法的归纳。
目录
1. start 和 run
2. join()
3. getId() , getName(), setName(String name)
4. getPriority() 、setPriority()
5. getState()
6. interrupt() 、isInterrupted() 、isAlive()、currentThread()
7. sleep(long n) 和 yield()
具体可以看这篇
【Java】多线程——使用run() 和 start() 启动线程的区别_在全栈的路上打酱油的博客-CSDN博客
说明 | 注意 | |
run() | 新线程启动后会调用的方法 | 如果在构造Thread对象时传递了Runnable 参数,则线程启动后会调用 Runnable 中的run方法,否则默认不执行任何操作。可以通过创建 Thread的子类对象来覆盖默认行为 |
start() | 启动一个新线程,在新的线程中运行run方法 | start 是让线程进入就绪状态,而不一样执行,因为不一定立刻执行线程,因为可能是在等待队列 |
上面run()的注意的解释就是,我们必须重写run()方法,在我们创建线程对象的时候,不管使用什么方法,如果不重新,则啥都不执行...因为不知道执行什么....
join() 方法就是合并线程,等待此线程完成后再执行其他线程,就是一种插队的做法。
简单来说就是当前有许多线程在排队等待被执行,使用这个方法,对应的线程等现在当前正在运行的线程结束后,就立刻执行对应的线程(就是插队)
同时可以通过使用 join(long n) 方法实现最多等n毫秒,n毫秒后,前面的线程就会结束。
通过代码来展示
public class TestJoin implements Runnable{
@Override
public void run() {
System.out.print("Join in>>>>>");
}
public static void main(String[] args) throws InterruptedException {
TestJoin testJoin = new TestJoin();
Thread thread = new Thread(testJoin);
thread.start();
for(int i = 0; i < 10; i++){
if(i == 2){
thread.join();
}
System.out.println("main "+ i);
}
}
}
得到的结果是
main 0
main 1
Join in>>>>>main 2
main 3
main 4
main 5
main 6
main 7
main 8
main 9
如果不适应join, 那么结果就是(就是把 thread.join()移除掉)
main 0
main 1
main 2
main 3
main 4
main 5
main 6
main 7
main 8
main 9
Join in>>>>>
Process finished with exit code 0
所以通过这种方式就可以实现线程插队。
同时可以添加参数
join(long n)
通过添加n毫秒时间,那么线程在等待n毫秒后还未执行就是强制将当前正在运行的线程停止并且执行自己。
getId() // 获取线程的id
getName() // 获取线程的名称
setName(String name) //修改线程名称
获取或改变优先级
线程的优先级是通过数字表示的,范围从1~10;
Thread.MIN_PRIORITY = 1;
Thread.MAX_PRIORITY = 10;
Thread.NORM_PRIORITY = 5;
优先级的设定建议在start() 调度前,于此同时,优先级低只是意味着获取调度的概率低,并不是优先级低就不会被调用
获取线程状态,Java中线程的状态是用6个enum表示: NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED
interrupt() 方法用于打断线程,如果被打断线程正在sleep,wait,join会导致被打断的线程抛出InterruptedException,并清除打断标记;如果打断的正在运行的线程,则会设置打断标记;park的线程被打断,也会设置打断标记
isInterrupted()注意用于判断线程是否被打断,不会清楚打断标记
isAlive() 线程是否存活
currentThread() 获取当前正在执行的线程
sleep():
1. 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞)
2. 其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException
3. 睡眠结束后的线程未必会立刻得到执行
4. 建议用 TimeUnit 的 sleep 代替 Thread 的 sleep 来获得更好的可读性
yield() :
1. 调用 yield 会让当前线程从 Running 进入 Runnable 就绪状态,然后调度执行其它线程
2. 具体的实现依赖于操作系统的任务调度器(礼让不一定成功)