在多線程中所有的操作方法都是從Thread類開始的,所有的操作基本都在Thread類中。
第一取得線程名字
a,在Thread類中,可以通過getName()方法,獲得線程的名字,可以通過setName()方法設置線程的名字
b,線程名字一般在線程啟動前設置,但是也允許為已經運行的線程設置名稱,允許2個Thread對象有相
同的名字,但是不推薦,你懂的!!!
c,如果程序沒有為線程指定名字,則系統自動為線程分配一個名稱。
package xianchengcaozuo; public class ThreadName { public static void main(String[] args) { Demo d1= new Demo(); Thread t1= new Thread(d1); Thread t2= new Thread(d1,"線程A"); Thread t3= new Thread(d1,"線程B"); Thread t4= new Thread(d1); t1.start(); t2.start(); t3.start(); t4.start(); } } class Demo implements Runnable{ @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<5;i++){ System.out.println(Thread.currentThread().getName()+"運行,i="+i); } } }
Thread-0運行,i=0 Thread-0運行,i=1 Thread-0運行,i=2 線程A運行,i=0 線程A運行,i=1 線程A運行,i=2 Thread-0運行,i=3 Thread-0運行,i=4 線程A運行,i=3 線程A運行,i=4 線程B運行,i=0 線程B運行,i=1 線程B運行,i=2 線程B運行,i=3 線程B運行,i=4 Thread-1運行,i=0 Thread-1運行,i=1 Thread-1運行,i=2 Thread-1運行,i=3 Thread-1運行,i=4
沒指定名字,則按編號!!
第二 獲取當前線程對象currentThread()
第三判斷線程是否啟動成功 isAlive()
第四 強制運行線程
package xianchengcaozuo; /* * 強制運行線程用join方法,期間其它線程無法運行,必須等待此線程 * 執行完后,其它線程才可以執行 */ public class Qiangzhi { public static void main(String[] args) { Demo1 d1= new Demo1(); Thread t1= new Thread(d1,"線程A"); t1.start(); for(int i=0;i<50;i++){ if(i>10){ try { t1.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("main線程運行:"+i); } } } class Demo1 implements Runnable{ @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<50;i++){ System.out.println(Thread.currentThread().getName()+"運行,i="+i); } } }
結果:
main線程運行:0 main線程運行:1 main線程運行:2 main線程運行:3 main線程運行:4 main線程運行:5 main線程運行:6 main線程運行:7 main線程運行:8 main線程運行:9 main線程運行:10 線程A運行,i=0 線程A運行,i=1 線程A運行,i=2 線程A運行,i=3 線程A運行,i=4 線程A運行,i=5 線程A運行,i=6 線程A運行,i=7 線程A運行,i=8 線程A運行,i=9 線程A運行,i=10 線程A運行,i=11 線程A運行,i=12 線程A運行,i=13 線程A運行,i=14 線程A運行,i=15 線程A運行,i=16 線程A運行,i=17 線程A運行,i=18 線程A運行,i=19 線程A運行,i=20 線程A運行,i=21 線程A運行,i=22 線程A運行,i=23 線程A運行,i=24 線程A運行,i=25 線程A運行,i=26 線程A運行,i=27 線程A運行,i=28 線程A運行,i=29 線程A運行,i=30 線程A運行,i=31 線程A運行,i=32 線程A運行,i=33 線程A運行,i=34 線程A運行,i=35 線程A運行,i=36 線程A運行,i=37 線程A運行,i=38 線程A運行,i=39 線程A運行,i=40 線程A運行,i=41 線程A運行,i=42 線程A運行,i=43 線程A運行,i=44 線程A運行,i=45 線程A運行,i=46 線程A運行,i=47 線程A運行,i=48 線程A運行,i=49 main線程運行:11 main線程運行:12 main線程運行:13 main線程運行:14 main線程運行:15 main線程運行:16 main線程運行:17 main線程運行:18 main線程運行:19 main線程運行:20 main線程運行:21 main線程運行:22 main線程運行:23 main線程運行:24 main線程運行:25 main線程運行:26 main線程運行:27 main線程運行:28 main線程運行:29 main線程運行:30 main線程運行:31 main線程運行:32 main線程運行:33 main線程運行:34 main線程運行:35 main線程運行:36 main線程運行:37 main線程運行:38 main線程運行:39 main線程運行:40 main線程運行:41 main線程運行:42 main線程運行:43 main線程運行:44 main線程運行:45 main線程運行:46 main線程運行:47 main線程運行:48 main線程運行:49
第五 線程的休眠
package xianchengcaozuo; import java.util.Date; /* * 通過sleep方法,可以使線程暫停執行 * */ public class ThreadSleep { public static void main(String[] args) { Demo2 d1= new Demo2(); Thread t1= new Thread(d1,"線程C"); t1.start(); } } class Demo2 implements Runnable{ @Override public void run() { for(int i=0;i<10;i++){ try { //此處是毫秒 Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(new Date()); System.out.println(Thread.currentThread().getName()+"運行,i="+i); } } }
Tue Apr 22 11:10:40 CST 2014 線程C運行,i=0 Tue Apr 22 11:10:45 CST 2014 線程C運行,i=1 Tue Apr 22 11:10:50 CST 2014 線程C運行,i=2 Tue Apr 22 11:10:55 CST 2014 線程C運行,i=3 Tue Apr 22 11:11:00 CST 2014 線程C運行,i=4
線程終止:
如果主線程是5000,那么會先run正常,在被終止
package xianchengcaozuo; //當一個線程運行的時候,另一個線程可以通過interrupt方法種植其線程. class MyThread09 implements Runnable { public void run() { System.out.println("1、進入run方法"); for (int i = 0; i < 5; i++) { try { Thread.sleep(5000); System.out.println("2、休眠已經完成"); } catch (Exception e) { System.out.println("3、休眠被終止"); return; } System.out.println("4、run方法正常結束"); } } } class Threadinterrupt{ public static void main(String[] args) { MyThread09 my = new MyThread09(); Thread t = new Thread(my,"線程"); t.start(); try { Thread.sleep(2000); } catch (Exception e) { } t.interrupt(); } }
1、進入run方法
3、休眠被終止
線程的優先級:
package xianchengcaozuo; public class Threadjibie { public static void main(String[] args) { Demo5 my = new Demo5(); Thread t1 = new Thread(my,"線程A"); Thread t2 = new Thread(my,"線程B"); Thread t3 = new Thread(my,"線程C"); //設置線程優先級 t1.setPriority(Thread.MIN_PRIORITY); t2.setPriority(Thread.NORM_PRIORITY); t3.setPriority(Thread.MAX_PRIORITY); t1.start(); t2.start(); t3.start(); } } class Demo5 implements Runnable { public void run() { for (int i = 0; i < 5; i++) { try { Thread.sleep(500); } catch (Exception e) { } System.out.println(Thread.currentThread().getName() + "運行,i = " + i); } } }
線程C運行,i = 0 線程B運行,i = 0 線程A運行,i = 0 線程C運行,i = 1 線程B運行,i = 1 線程A運行,i = 1 線程C運行,i = 2 線程B運行,i = 2 線程A運行,i = 2 線程C運行,i = 3 線程B運行,i = 3 線程A運行,i = 3 線程C運行,i = 4 線程B運行,i = 4 線程A運行,i = 4
主方法的優先級是中級
線程的禮讓:
package xianchengcaozuo; //yield(),線程禮讓,將操作讓給其它線程 public class ThreadLirang { public static void main(String[] args) { Demo6 d1= new Demo6(); Thread t1 = new Thread(d1); Thread t2 = new Thread(d1); t1.start(); t2.start(); } } class Demo6 implements Runnable{ @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<5;i++){ System.out.println(Thread.currentThread().getName()+"運行,i="+i); if(i==3){ Thread.currentThread().yield(); System.out.println(Thread.currentThread().getName()+"禮讓"); } } } }
結果: Thread-1運行,i=0
Thread-1運行,i=1
Thread-1運行,i=2
Thread-1運行,i=3
Thread-0運行,i=0
Thread-0運行,i=1
Thread-0運行,i=2
Thread-0運行,i=3
Thread-0禮讓
Thread-0運行,i=4
Thread-1禮讓
Thread-1運行,i=4