目录
sleep方法处理异常:InterruptedException.
线程API
获取线程相关信息的方法
package thread;
/**
* 获取线程相关信息的一组方法
*/
public class ThreadInfoDemo {
public static void main(String[] args) {
Thread main = Thread.currentThread();//获取主线程
String name = main.getName();//获取线程的名字
System.out.println("名字:"+name);
long id = main.getId();//获取该线程的唯一标识
System.out.println("id:"+id);
int priority = main.getPriority();//获取该线程的优先级
System.out.println("优先级:"+priority);
boolean isAlive = main.isAlive();//该线程是否活着
System.out.println("是否活着:"+isAlive);
boolean isDaemon = main.isDaemon();//是否为守护线程
System.out.println("是否为守护线程:"+isDaemon);
boolean isInterrupted = main.isInterrupted();//是否被中断了
System.out.println("是否被中断了:"+isInterrupted);
}
}
线程优先级
线程start后会纳入到线程调度器中统一管理,线程只能被动的被分配时间片并发运行,而无法主动索取时间片.线程调度器尽可能均匀的将时间片分配给每个线程.
线程有10个优先级,使用整数1-10表示
1为最小优先级,10为最高优先级.5为默认值
调整线程的优先级可以最大程度的干涉获取时间片的几率.优先级越高的线程获取时间片的次数越多,反之则越少.
Thread提供了对应的常量:MAX_PRIORITY表示最高优先级10,MIN_PRIORITY表示最低优先级,NORM_PRIORITY表示默认优先级5
package thread;
public class PriorityDemo {
public static void main(String[] args) {
Thread max = new Thread(){
public void run(){
for(int i=0;i<10000;i++){
System.out.println("max");
}
}
};
Thread min = new Thread(){
public void run(){
for(int i=0;i<10000;i++){
System.out.println("min");
}
}
};
Thread norm = new Thread(){
public void run(){
for(int i=0;i<10000;i++){
System.out.println("nor");
}
}
};
min.setPriority(Thread.MIN_PRIORITY);
max.setPriority(Thread.MAX_PRIORITY);
min.start();
norm.start();
max.start();
}
}
sleep阻塞
线程提供了一个静态方法:
static void sleep(long ms)
使运行该方法的线程进入阻塞状态指定的毫秒,超时后线程会自动回到RUNNABLE状态等待再次获取时间片并发运行.
package thread;
public class SleepDemo {
public static void main(String[] args) {
System.out.println("程序开始了!");
try {
Thread.sleep(5000);//主线程阻塞5秒钟
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("程序结束了!");
}
}
sleep方法处理异常:InterruptedException.
当一个线程调用sleep方法处于睡眠阻塞的过程中,该线程的interrupt()方法被调用时,sleep方法会抛出该异常从而打断睡眠阻塞.
package thread;
/**
* sleep方法要求必须处理中断异常
* 当一个线程调用sleep方法处于睡眠阻塞的过程中,如果此时该线程的interrupt()方法被
* 调用,此时会中断该线程的睡眠阻塞,那么sleep方法就会抛出中断异常。
*/
public class SleepDemo2 {
public static void main(String[] args) {
Thread lin = new Thread("林永健"){
public void run(){
System.out.println(getName()+":刚美完容,睡一会吧...");
try {
Thread.sleep(500000000);
} catch (InterruptedException e) {
System.out.println(getName()+":干嘛呢!干嘛呢!干嘛呢!都破了相了!");
}
System.out.println(getName()+":醒了");
}
};
Thread huang = new Thread("黄宏"){
public void run(){
System.out.println(getName()+":大锤80,小锤40,开始砸墙!");
for(int i=0;i<5;i++){
System.out.println(getName()+":80!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("咣当!!!");
System.out.println(getName()+":大哥!搞定!");
lin.interrupt();//中断lin线程的睡眠阻塞
}
};
lin.start();
huang.start();
}
}
守护线程
概念:
守护线程也称为:后台线程
守护线程是通过普通线程调用setDaemon(boolean on)方法设置而来的,因此创建上与普通线程无异.
守护线程的结束时机上有一点与普通线程不同,即:进程的结束.
进程结束:当一个进程中的所有普通线程都结束时,进程就会结束,此时会杀掉所有正在运行的守护线程.
用途:
GC就是运行在守护线程上的
当我们有一个任务不需要关注何时结束,当程序需要结束时可以一起结束的任务就可以放在守护线程上执行
package thread;
/**
* 守护线程
* 线程提供了一个方法:
* void setDaemon(boolean on)
* 如果参数为true,则会将当前线程设置为守护线程。
*
* 守护线程与普通的用户线程(线程创建出来时默认就是用户线程)的区别在于进程结束
*
* 进程结束:
* 当一个JAVA进程中所有的用户线程都结束时,进程就会结束,此时会强制杀死所有还在运行
* 的守护线程。
*
* GC就是运行在一条守护线程上的。
*/
public class DaemonThreadDemo {
public static void main(String[] args) {
Thread rose = new Thread("rose"){
public void run(){
for(int i=0;i<5;i++){
System.out.println(getName()+":let me go !!!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
System.out.println(getName()+":啊啊啊啊啊AAAAAAaaaaa....");
System.out.println("噗通!");
}
};
Thread jack = new Thread("jack"){
public void run(){
while(true){
System.out.println(getName()+":you jump!i jump!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
};
rose.start();
jack.setDaemon(true);//设置守护线程必须在线程启动前进行
jack.start();
}
}
补充
线程Thread类的常用方法
- void run():线程本身有run方法,可以在第一种创建线程时重写该方法来定义线程任务。
- void start():启动线程的方法。调用后线程被纳入到线程调度器中统一管理,并处于RUNNABLE状态,等待分配时间片开始并发运行
注:线程第一次获取时间片开始执行时会自动执行run方法。
启动线程一定是调用start方法,而不能调用run方法!
- String getName():获取线程名字
- long getId():获取线程唯一标识
- int getPriority():获取线程优先级,对应的是整数1-10
- boolean isAlive():线程是否还活着
- boolean isDaemon():是否为守护线程
- boolean isInterrupted():是否被中断了
- void setPriority(int priority):设置线程优先级,参数可以传入整数1-10。1为最低优先级,5为默认优先级,10为最高优先级
优先级越高的线程获取时间片的次数越多。可以使用Thread的常量
MIN_PRIORITY,NORM_PRIORITY,MAX_PRIORITY。 他们分别表示最低,默认,最高优先级
static void sleep(long ms):静态方法sleep可以让运行该方法的线程阻塞参数ms指定的毫秒。
static Thread currentThread():获取运行该方法的线程。
- void setDaemon(boolean on):设置线程是否为守护线程,当参数为true时当前线程被设置为守护线程。该操作必须在线程启动前进行
守护线程与普通线程的区别
主要体现在当java进程中所有的普通线程都结束时进程会结束,在结束前会杀死所有还在运行的守护线程。