【Java多线程并发总结】Thread类的常用方法(join、yield等)---线程的基础操作篇

 Thread类的常用方法

目录

 Thread类的常用方法

 启动(start) 

休眠(sleep)

当前线程(currentThread) 

join

设置优先级(setPriority)

 让步(yield)

设为后台进程(setDaemon)

 中断(interrupt) 

已经过时的方法(stop、suspend、destroy)


 启动(start) 

 最基本的操作,调用Runnable中的run方法,无返回值。

new Thread(new Test()).start();

休眠(sleep)

 使当前线程休眠一段时间,默认为毫秒级,最高可以精确到纳秒,调用的方法为sleep(long millis, int nanos)。

 public void run() {
        try {
            Thread.sleep(1000);  //休眠1000ms=1s
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

当前线程(currentThread) 

 返回当前线程的实例。

Thread thread=Thread.currentThread();

join

等待当前线程终止,可以设置等待时间,当超过等待时间时放弃等待。

public class Main {
    public static void main(String[] args){
        Thread thread1=new Thread(new Test());
        Thread thread2=new Thread(new Test());
        thread1.start();
        try {
            thread1.join();    //此时等待thread1执行
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread2.start();    //当thread1执行完毕后执行
    }
}

设置优先级(setPriority)

 设置当前线程的优先级,优先级分三个等级最低优先级MIN_PRIORITY、默认优先级NORM_PRIORITY、最高优先级MAX_PRIORITY

注意:这仅仅只是给系统一个暗示,并不能确保什么

thread.setPriority(Thread.MIN_PRIORITY);

 让步(yield)

 暂停当前线程,执行其他线程。

注意:这仅仅只是给系统一个暗示,它告诉系统我已经执行完我最重要部分,系统可以去把主要资源用于其他的线程,但是不能确定系统一定会答应,也不能确定系统什么时候答应,所以我们在处理多线程的复杂操作时不应该依赖于yield。

Thread.yield();

设为后台进程(setDaemon)

后台进程运行在后台,独立于整个系统,当系统进程结束,也就是只剩下后台进程时,后台进程退出。

thread.setDaemon(true);

 中断(interrupt) 

中断线程。

注意:它经常会因为它的名字被误用,它虽然叫中断,但是并不会中断线程,实际上stop()方法有中断线程的作用,所以现在stop已经嗝屁了,由于具有不安全性而被java废除,当然interrupt不能重蹈stop的覆辙,所以它只是给线程打上一个interrupt标记,通过Thread.interrupted可以获取其中断状态,我们可以通过这个标记对当前线程进行处理。

如果当前线程没有中断它自己,则该线程的 checkAccess 方法就会被调用,这可能抛出 SecurityException。

如果线程在调用wait() 方法,或者该类的join()、sleep()方法过程中受阻,则抛出 InterruptedException。

如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个 ClosedByInterruptException。

如果该线程在一个 Selector 中受阻,则该线程的中断状态将被设置,它将立即从选择操作返回,并可能带有一个非零值,就好像调用了选择器的 wakeup 方法一样。

public class Test implements Runnable{
    @Override
    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
            System.out.println("线程中断");
            return;
        }
    }
}
public class Main {
    public static void main(String[] args){
       Thread thread=new Thread(new RunTest());
        thread.start();
        thread.interrupt();
    }
}

 运行结果

java.lang.InterruptedException: sleep interrupted
线程中断
	at java.lang.Thread.sleep(Native Method)
	at Test.run(Test.java:5)
	at java.lang.Thread.run(Thread.java:745)

Process finished with exit code 0

已经过时的方法(stop、suspend、destroy)

 他们分别是强行停止线程、强行挂起线程、破坏线程,但是现在他们已经被废除,原因便是它们会导致死锁或其他安全性问题。

你可能感兴趣的:(Java)