public final void join( ) throws InterruptedException
等待这个线程死亡。
调用此方法的行为方式与调用完全相同
join (0)
异常InterruptedException -如果任何线程中断当前线程。当抛出此异常时, 当前线程的中断状态将被清除。
public void interrupt()
中断这个线程。
除非当前线程中断自身,这是始终允许的
public static boolean interrupted()
测试当前线程是否中断。该方法可以清除线程的中断状态。换句话说,如果这个方法被连续调用两次,那么第二个调用将返回false (除非当前线程再次中断,在第一个调用已经清除其中断状态之后,在第二个调用之前已经检查过)。
忽略线程中断,因为线程在中断时不存在将被该方法返回false所反映。
自定义标记中断线程
中断线程:
1、使用interrupt方法来中断线程,设置中断状态(标记),容易被很多方法清除,需要加判断,处理清理相对麻烦
2、自定义标记中断线程(推荐),更灵活
代码示例:
package com.booy;
import static java.lang.Thread.interrupted;
public class ThreadDemo2 {
public static void main(String[] args) {
MyRunnable1 mr = new MyRunnable1();
Thread t = new Thread(mr);
t.start();
MyRunnable2 mr2 = new MyRunnable2();
Thread t2 = new Thread(mr2);
t2.start();
//主线程
for (int i = 0; i <50 ; i++) {
System.out.println(Thread.currentThread().getName()+"--"+i);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(i == 20){
// try {
// t.join();//等待t2执行完毕
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
mr2.flag = false;
}
// t.interrupt();//1、线程中断标记,具体中断取决于线程自身
}
}
}
class MyRunnable1 implements Runnable{
@Override
public void run() {
for (int i = 0; i <50 ; i++) {
// if(Thread.interrupted()){//3、测试中断状态
// break;
// }
System.out.println(Thread.currentThread().getName()+"--"+i);
try {
Thread.sleep(300);//线程休眠
} catch (InterruptedException e) {
e.printStackTrace();
// Thread.currentThread().interrupt();//2、避免标记被异常清除无法返回中断状态
}
}
}
}
//自定义中断
class MyRunnable2 implements Runnable{
public boolean flag = true;
public MyRunnable2(){
flag = true;
}
@Override
public void run() {
while (flag){
int i = 0;
System.out.println(Thread.currentThread().getName()+"--"+(i++));
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
守护线程与yield
public final void setDaemon(boolean on)
将此线程标记为daemon线程或用户线程。当运行的唯线程都是守护进程线程时, Java虚拟机将退出。
public final boolean isDaemon()
测试这个线程是否是守护线程。
public static void yield()
暂停当前正在执行的线程对象,并执行其他线程。( 了解)
其他方法与优先级
long getld()
:返回该线程的标识符。
String getName()
:返回该线程的名称。
void setName(String name)
:改变线程名称,使之与参数name相同。
boolean isAlive()
:测试线程是否处于活动状态。
void setPriority(int newPriority)
:更改线程的优先级。优先级高可以提高该线程抢cpu时间片的概率
static int MAX_ PRIORITY
:线程可以具有的最高优先级。
static int MIN PRIORITY
:线程可以具有的最低优先级。
static int NORM PRIORITY
:分配给线程的默认优先级。