interrupt方法
interrupt方法:结束线程在调用Object类的wait方法或该类的join方法、sleep方法过程中的阻塞状态,并在调用wait、join和sleep方法处产生InterruptedException异常。提前结束调用该方法的线程的阻塞。
import java.util.Date;
public class Test {
public static void main(String[] args) {
CountThread countThread = new CountThread(timeThread);
countThread.start();
try {
Thread.sleep(8000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("1111");
countThread.interrupt();//CountThread是调用方法的线程,main是执行方法的线程
}
class CountThread extends Thread{
@Override
public void run() {
for(int i=0;i<50;++i) {
System.out.println("计数1!!!"+i);
try {
sleep(10000000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
因此在输出完“计数1!!!0”后由于CountThread线程中阻塞,经过8秒后,再输出“1111”。
然后结束CountThread线程中阻塞,最后输出一次“计数1!!!1”。
join方法
join方法:执行该方法的线程进入阻塞状态,直到调用该方法的线程结束后再由阻塞转为就绪状态。执行join方法的线程阻塞,直到调用join方法的线程完毕。
线程对象在调用join方法前必须先调用start方法,否则该线程永远不会进入执行状态。
import java.util.Date;
public class Test {
public static void main(String[] args) {
TimeThread timeThread = new TimeThread();
timeThread.start();
CountThread countThread = new CountThread(timeThread);
countThread.start();
}
}
class CountThread extends Thread{
TimeThread timeThread;
CountThread(TimeThread timeThread){
this.timeThread=timeThread;
}
@Override
public void run() {
for(int i=0;i<50;++i) {
System.out.println("计数1!!!"+i);
if(i==2) {
try {
timeThread.join();//执行join方法的为CountThread线程,调用的为TimeThread线程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class TimeThread extends Thread{
@Override
public void run() {
for(int i=0;i<50;++i) {
System.out.println("计数2###"+new Date());
}
}
}
因此在输出完"计数1!!!2"后,CountThread线程阻塞,开始输出“计数2###0”直到输出完“计数2###49”后,CountThread线程阻塞结束,开始输出计数“1!!!3”,直到“计数1!!!49”。
currentThread方法
currentThread方法: 哪个线程执行该代码,thread指代哪个线程。返回正在执行的线程对象。
一个方法不是一个线程,方法只是被一个线程执行。
import java.util.Date;
public class Test {
public static void main(String[] args) {
Thread thread = Thread.currentThread();//哪个线程执行该代码,thread指代哪个线程
System.out.println(thread);
}
}
因此输出主线程main。
isAlive方法
isAlive方法:判定该线程是否处于就绪、运行或阻塞状态,如果是则返回true,否则返回false。
import java.util.Date;
public class Test {
public static void main(String[] args) {
Thread thread = Thread.currentThread();//主线程执行
TimeThread timeThread = new TimeThread(thread);
timeThread.start();
System.out.println("####"+thread.isAlive());
}
}
class TimeThread extends Thread{
Thread thread;
TimeThread(Thread thread){
this.thread=thread;
}
@Override
public void run() {
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("@@@@@"+thread.isAlive());
}
}
由于主线程执行currentThread方法,因此在执行System.out.println("####"+thread.isAlive());时,主线程必定存活,因此输出“####true”,在执行完成后主线程死亡。由主线程执行start方法时,由于TimeThread线程阻塞,一秒后主线程已经死亡,因此在执行System.out.println("@@@@@"+thread.isAlive());时,主线程已经死亡,因此输出“####flase”。
setDaemon方法
setDaemon方法:用于将一个尚未调用线程start方法的线程设置为守护线程。守护线程主要用于为其他线程的运行提供服务(Java中的垃圾回收机制就是守护线程),这种线程属于创建它的线程。
1.线程为守护线程,随着进程中最后一个非守护线程的结束而结束
public class Test {
public static void main(String[] args) {
TimeThread timeThread = new TimeThread();
timeThread.setDaemon(true);
timeThread.start();//线程对象调用start之前调用setDaemon且值设置为true,则该线程为守护线程,随着进程中最后一个非守护线程的结束而结束
try {
Thread.sleep(12);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class TimeThread extends Thread{
@Override
public void run() {
while(true){
System.out.println(111);
}
}
}
则执行12msTimeThread线程后,由于主线程结束,TimeThread线程也结束。
2.进程中所启动的其他非守护线程不会随着某一个非守护线程的结束而结束
3.进程随着最后一个非守护线程的结束而结束
其他方法
void start():使该线程开始启动,Java 虚拟机负责调用该线程的 run() 方法。多次启动一个线程是非法的。
void sleep(long millis):Thread类静态方法,线程进入阻塞状态,在指定时间(单位为毫秒)到达之后进入就绪状态(Runnable),而非立即进入执行状态。
void yield():静态方法,当前线程放弃占用CPU资源,回到就绪状态,使其他优先级不低于此线程的线程有机会被执行。
void setPriority(int newPriority):设置当前线程的优先级,线程优先级越高,线程获得执行的次数越多,Java线程的优先级用整数表示,取值范围是1~10,Thread类有以下三个静态常量:
static int MAX_PRIORITY 最高优先级值为10;
static int NORM_PRIORITY 默认优先级值为5;
static int MIN_PRIORITY 最低优先级值为1;
注意:同一个线程类创建的多个线程,线程优先级越高的线程获得的执行次数极有可能越多;但是不同线程类创建的线程,线程优先级越高,执行次数不一定越多,这个run方法的代码复杂度有关。
int getPriority():获得当前线程的优先级。