五、守护线程与yield
1.守护线程
public static void setDaemon(boolean on):将此线程标记为daemon线程或者用户线程,当运行的唯一线程都是守护进程线程时,JAVA虚拟机将退出。
public final boolean isDaemon() :测试这个线程是否是守护线程。
应用场景:当一个程序退出了,其他项的任务也跟着停止了,不用一个个关闭线程。
程序:
public class ThreadDemo3 {
public static void main(String[] args) {
MyRunnable4 mr4 =new MyRunnable4();
Thread t =new Thread(mr4);
//线程可以分为守护线程和用户线程,当进程中没有用户线程时,JVM会退出
t.setDaemon(true); //把线程设置为守护线程
t.start();
for (int i =0; i <50; i++) {
System.out.println("main-"+i);
try {
Thread.sleep(200);
}catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class MyRunnable4implements Runnable{
@Override
public void run() {
for (int i =0; i <50; i++) {
System.out.println("-"+i);
try {
Thread.sleep(500);
}catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
运行效果:
2.yield(了解,几乎用不到)
public static void yield() :暂停当前正在执行的线程对象,并执行其他线程。
public class ThreadDemo3 {
public static void main(String[] args) {
MyRunnable4 mr4 =new MyRunnable4();
Thread t =new Thread(mr4);
//线程可以分为守护线程和用户线程,当进程中没有用户线程时,JVM会退出
t.setDaemon(true); //把线程设置为守护线程
t.start();
for (int i =0; i <50; i++) {
System.out.println("main-"+i);
try {
Thread.sleep(200);
}catch (InterruptedException e) {
e.printStackTrace();
}
if(i==5)
{
Thread.yield(); //让出本次CPU执行时间片,让一次
}
}
}
}
class MyRunnable4implements Runnable{
@Override
public void run() {
for (int i =0; i <50; i++) {
System.out.println("-"+i);
try {
Thread.sleep(500);
}catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
六、其他方法与优先级
long getId() :返回该线程的标识符。
String getName() :返回该线程的名称
void setName() :改变线程的名称,使之与参数name相同
boolean isAlive() :测试线程是否处于活动状态
void setPriority(int newPriority): 更改线程优先级
static int MAX_PRIORITY:线程可以具有的最高优先级
static int MIN_PRIORITY: 线程可以具有的最低优先级
static int NORM_PRIORITY: 分配给线程的默认优先级,一般创建的线程就是默认优先级
代码:
MyRunnable4 mr4 =new MyRunnable4();
Thread t =new Thread(mr4);
//优先级高可以提高该线程抢占CPU时间片的概率大
t.setPriority(Thread.MAX_PRIORITY);
//线程可以分为守护线程和用户线程,当进程中没有用户线程时,JVM会退出
t.setDaemon(true); //把线程设置为守护线程
t.start();