版权声明:ByRisonBoy https://blog.csdn.net/Rison_Li/article/details/83186004
1、普通创建子线程
代码片段:
public class Main {
public static void main(String[] args) {
MyThread t = new MyThread();
t.start();
System.out.println("我是主线程!");
}
}
class MyThread extends Thread {
public void run() {
System.out.println("我是一个子线程!我执行完毕了!");
}
}
显示结果:
我是主线程!
我是一个子线程!我执行完毕了!
2、Join():等到子线程结束了主线程才执行
代码片段:
public class Main {
public static void main(String[] args) throws InterruptedException {
MyThread t = new MyThread();
t.start();
t.join();
System.out.println("我是主线程!");
}
}
class MyThread extends Thread {
public void run() {
System.out.println("我是一个子线程!我执行完毕了!");
}
}
显示结果:
我是一个子线程!我执行完毕了!
我是主线程!
3、Thread守护线程
java中线程分为两种类型:用户线程和守护线程。通过Thread.setDaemon(false)
设置为用户线程;通过Thread.setDaemon(true)
设置为守护线程。如果不设置该属性,默认为用户线程。
代码片段:
public class Main {
public static void main(String[] args) throws InterruptedException {
MyThread t = new MyThread();
t.setDaemon(true);
t.start();
System.out.println("我是主线程!");
}
}
class MyThread extends Thread {
public void run() {
System.out.println("我是一个子线程!我执行完毕了!");
}
}
结果显示:
我是主线程!
我是一个子线程!我执行完毕了!
用户线程和守护线程的区别
用户线程和守护线程都是线程,区别是Java虚拟机在所有用户线程dead后,程序就会结束。而不管是否还有守护线程还在运行,若守护线程还在运行,则会马上结束。很好理解,守护线程是用来辅助用户线程的,如公司的保安和员工,各司其职,当员工都离开后,保安自然下班了。
4、Thread.yield()
:暂停当前正在执行的线程对象,并执行其他线程
代码片段:
public class Main {
public static void main(String[] args) throws InterruptedException {
MyThread t = new MyThread("线程一");
MyThread t2 = new MyThread("线程二");
t.start();
t2.start();
System.out.println("我是主线程!");
}
}
class MyThread extends Thread {
public MyThread (String name) {
super(name);
}
public void run() {
for(int i = 0; i <= 50; i++) {
System.out.println(this.getName() + ":" + this.getId()+"||"+"i = " + i);
if(i == 10) {
this.yield();//暂停线程执行其他线程
}
}
}
}
结果显示:
这个结果有很多种情况,可能在10的时候,暂停后线程一可能又拿到了cpu的执行权,接着运行11(线程一)。
5、线程优先级Priority
代码片段:
public class Main {
public static void main(String[] args) throws InterruptedException {
MyThread t1 = new MyThread("线程一");
MyThread t2 = new MyThread("线程二");
t1.setPriority(1); //设置线程优先级 范围在1-10(超出会抛异常)
t2.setPriority(10);
t1.start();
t2.start();
System.out.println("我是主线程!");
}
}
class MyThread extends Thread {
public MyThread (String name) {
super(name);
}
public void run() {
System.out.println(this.getName());
}
}
显示结果:
我是主线程!
线程二
线程一
注:因为给线程T1设置了t1.setPriority(1)
1的优先级,而给线程T2设置了t2.setPriority(10)
10的优先级,所以T2拥有较多的CPU执行权,所以先执行完毕;优先级只可以设置1~10范围,优先级越高,获取CPU执行权就越多,设置优先权都是建议性的让cpu优先执行某个线程,所以设置优先权未必有效,如果设置优先级超过了1~10的范围,就会抛出异常;
。。。