這篇博客主要是總結一下java中線程常用的操作方法。
Thread(Runnable target) 分配一個新的Thread對象
Thread(Runnable target,String name) 分配新的Thread對象,并給線程命名
Thread(String name) 分配新的Thread對象
static Thread currentThread() 返回當前正在執行的線對象的引用
long getId() 返回線程的標識符
String getName() 返回線程的名稱
void setName(String name) 改變線程名稱,使之與參數name相同
boolean isAlive() 測試線程是否處于活動狀態
Demo:
public class ThreadDemo { public static void main(String args[]) { MyThread myThread=new MyThread(); //實例化一個線程對象并給其賦值 Thread thread=new Thread(myThread,"小白線程"); //獲取線程的ID System.out.PRintln(thread.getId()); //設置線程的名稱 thread.setName("小黑線程"); thread.start(); System.out.println("thread線程是否活動"+thread.isAlive()); }}class MyThread implements Runnable{ @Override public void run() { System.out.println(Thread.currentThread().getName()); }}static void sleep(long millis) 休眠指定的毫秒繼續執行 sleep方法休眠完成后,線程會重新恢復到就緒狀態
sleep方法的原理 讓當前線程進入休眠狀態,讓出當次執行的CPU時間,但是不丟失監視器的所屬權。
static void sleep(long millis,int nanos) 休眠指定毫秒 納秒之后繼續執行
Demo:
public class ThreadDemo2 { public static void main(String args[]) { MyThread2 myThread2=new MyThread2(); Thread thread=new Thread(myThread2); thread.start(); for(int i=0;i<10;i++) { System.out.println(Thread.currentThread().getName() +"-"+i+" "); //讓當前線程進入休眠狀態 try { Thread.sleep(1000); }catch (InterruptedException ex) { ex.printStackTrace(); } } }}class MyThread2 implements Runnable{ @Override public void run() { for (int i=0;i<10;i++) { System.out.println(Thread.currentThread().getName() +"-"+i); try { //讓當前線程進入休眠狀態 Thread.sleep(1000); }catch (InterruptedException ex) { ex.printStackTrace(); } } }}void join() 等待調用該方法的線程執行完畢之后,再去執行其他線程
void join(long millis) 等待該線程終止的時間最長為milli毫秒
void join(long millis,int nanos) 等待該線程的終止的時間最長毫秒 納秒
Demo:
public class ThreadDemo3 { public static void main(String args[]) { MyThread3 myThread3=new MyThread3(); Thread thread=new Thread(myThread3); thread.start(); for (int i=0;i<9;i++) { System.out.println("Main"+i); if(i==5) { try { //等待thread線程終止在執行主線程 thread.join(); }catch (InterruptedException ex) { ex.printStackTrace(); } } try { Thread.sleep(1000); }catch (InterruptedException ex) { ex.printStackTrace(); } } }}class MyThread3 implements Runnable{ @Override public void run() { for(int i=0;i<8;i++) { System.out.println(Thread.currentThread().getName()+"-"+i); try { Thread.sleep(1000); }catch (InterruptedException ex) { ex.printStackTrace(); } } }}void interrupt() 中斷線程
static boolean interrupted() 測試當前線程是否已經中斷
void setPriority(int newPriority) 更改線程的優先級
優先級高的線程也不一定百分百搶到CPU,只是說搶到的概率大一些
static int MAX_PRIORITY 線程可以具有的最高優先級
static int MIN_PRIORITY 線程可以具有的最低優先級
static int NORM_PRIORITY 分配給線程的默認優先級
Demo:
/** * 中斷線程 * 1.Interrupt()方法只是設置了線程的中斷標記為true,并沒有真正的中斷線程,線程還在執行 * 真正中斷線程還是得自身中斷 * 2.自定義標記完成中中斷 *//** * 設置線程的優先級 */public class ThreadDemo4 { public static void main(String args[]) { MyThread4 myThread4=new MyThread4(); Thread thread=new Thread(myThread4,"t1"); //start方法是開辟新的線程執行run()方法 Mythread5 mythread5=new Mythread5(); Thread thread1=new Thread(mythread5,"t2"); //設置線程的優先級 thread.setPriority(Thread.MAX_PRIORITY); thread1.setPriority(Thread.MIN_PRIORITY); thread.start(); thread1.start(); for (int i=0;i<7;i++) { System.out.println("Main-"+i); if(i==5) { //thread.interrupt();//設置中斷標記(中斷狀態為True) mythread5.setFlag(false);//中斷線程 } try { Thread.sleep(1000); }catch (InterruptedException ex) { ex.printStackTrace(); } } }}class MyThread4 implements Runnable{ @Override public void run() { for (int i=0;i<7;i++) { System.out.println(Thread.currentThread().getName()+i); try { Thread.sleep(1000); }catch (InterruptedException ex) { ex.printStackTrace(); } } }}class Mythread5 implements Runnable{ private boolean flag = true; public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } @Override public void run() { int i=0; while (flag) { System.out.println(Thread.currentThread().getName()+i); i++; try { Thread.sleep(1000); }catch (InterruptedException ex) { ex.printStackTrace(); } } }}線程可以分為用戶線程與守護線程,我們自己創建的線程一般為用戶線程,守護線程是指當程序中沒有用戶線程的時候,所有的守護線程都會終止,如GC 垃圾回收機制
boolean isDaemon() 測試該線程的是否為守護線程
void setDaemon(boolean on) 將該線程標記為守護線程或者用戶線程
static void yield() 暫停當前正在執行的線程對象,并執行其他線程讓出本次的執行權,只讓一次
public class ThreadDemo5 { public static void main(String args[]) { MyThread6 myThread6=new MyThread6(); Thread thread=new Thread(myThread6); //設置線程為守護線程 // thread.setDaemon(true); thread.start(); for(int i=0;i<10;i++) { System.out.println("Main-"+i); if(i==5) { //讓出當次的cpu的執行時間 Thread.yield(); } try { Thread.sleep(1000); }catch (InterruptedException ex) { ex.printStackTrace(); } } }}class MyThread6 implements Runnable{ @Override public void run() { for (int i=0;i<20;i++) { System.out.println("Mythread6-"+i); try { Thread.sleep(1000); }catch (InterruptedException ex) { ex.printStackTrace(); } } }}新聞熱點
疑難解答