多线程运行状态 Java

版权声明: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的范围,就会抛出异常;

。。。

猜你喜欢

转载自blog.csdn.net/Rison_Li/article/details/83186004