javaThreadScheduling - juedaiyuer/researchNote GitHub Wiki

##线程的调度##

###优先级###

#设定优先级函数
setPriority(n)

package thread;

public class ThreadPriority {

	public static void main(String[] args) {
	    ThreadPriority thread=new ThreadPriority();
	    Thread t1 = thread.new MyThread1(); 
	    Thread t2 = new Thread(thread.new MyRunnable()); 
	    t1.setPriority(10); 
	    t2.setPriority(1); 

	    t2.start(); 
	    t1.start(); 
 }
 
 class MyThread1 extends Thread {
	 public void run() {
	     for (int i = 0; i < 10; i++) {
	         System.out.println("线程1第" + i + "次执行!");
	         try {
	             Thread.sleep(100);
	         } catch (InterruptedException e) {
	             e.printStackTrace();
	         }
	     }
	 }
 }

 class MyRunnable implements Runnable {
	 public void run() {
	     for (int i = 0; i < 10; i++) {
	         System.out.println("线程2第" + i + "次执行!");
	         try {
	             Thread.sleep(100);
	         } catch (InterruptedException e) {
	             e.printStackTrace();
	         }
	     }
	 }
 }

}

###让步###

  • 线程的让步使用Thread.yield()方法,yield()为静态方法,功能是暂停当前正在执行的线程对象,并执行其他线程。
  • 仅仅是让出,线程状态回到可运行状态。

###合并###

  • 线程的合并的含义就是将几个并行线程的线程合并为一个单线程执行,应用场景是当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法

  • 非静态方法

  • 哪一个线程调用就执行哪一个线程

    void join(): 等待该线程终止。 void join(long millis): 等待该线程终止的时间最长为 millis 毫秒。 void join(long millis, int nanos): 等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。

    package thread;

    public class ThreadJoin {

      public static void main(String[] args) {
          ThreadJoin join = new ThreadJoin();
          Thread t1 = join.new MyThread1();
          t1.start();
    
          for (int i = 0; i < 20; i++) {
              System.out.println("主线程第" + i + "次执行!");
              if (i > 2)
                  try {
                      // t1线程合并到主线程中,主线程停止执行过程,转而执行t1线程,直到t1执行完毕后继续。
                      t1.join();
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
          }
      }
    
      class MyThread1 extends Thread {
          public void run() {
              for (int i = 0; i < 10; i++) {
                  System.out.println("线程1第" + i + "次执行!");
              }
          }
      }
    

    }

###守护线程###

  • setDaemon(true)
  • JVM的垃圾回收、内存管理等线程都是守护线程
  • 数据库应用时候,使用的数据库连接池,连接池本身也包含着很多后台线程,监控连接个数、超时时间、状态等等