1.線程的建立 需繼承Thread,並重寫run方法java
public class MyThread extends Thread { @Override public void run() { for (int i=0;i<100;i++){ if(i%2==0){ System.out.println(i); } } } }
2.線程的使用ide
實例化,並調用Start()方法測試
獲取當前線程名稱的方法:this
Thread.currentThread().getName()
public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.start(); System.out.println("hello"); }
3. 問題1 ,不能直接調用run()方法啓動線程線程
直接調用run方法不會啓用線程,會在調用run方法的線程內執行code
4.問題2 ,線程實例不能再次start 會報 IllegalThreadStateException異常對象
能夠再實例化一個線程對象。繼承
5.練習生命週期
/* * 練習:建立兩個分線程,1 遍歷100內偶數 2 遍歷100內奇數 * */ public class ThreadDemo { public static void main(String[] args) { //1.建立對象方式 /* MyThread1 myThread1 = new MyThread1(); MyThread2 myThread2 = new MyThread2(); myThread1.start(); myThread2.start();*/ //2.建立Thread類的匿名子類方式 new Thread(){ @Override public void run() { for (int i = 0; i < 100; i++) { if(i%2==0){ System.out.println(Thread.currentThread().getName()+" : "+ i); } } } }.start(); new Thread(){ @Override public void run() { for (int i = 0; i < 100; i++) { if(i%2!=0){ System.out.println(Thread.currentThread().getName()+" : " +i); } } } }.start(); } } class MyThread1 extends Thread{ @Override public void run() { for (int i = 0; i < 100; i++) { if(i%2==0){ System.out.println(Thread.currentThread().getName()+" : "+ i); } } } } class MyThread2 extends Thread{ @Override public void run() { for (int i = 0; i < 100; i++) { if(i%2!=0){ System.out.println(Thread.currentThread().getName()+" : " +i); } } } }
6. Thread 的經常使用方法隊列
- void start() :啓動線程,並執行對象的run()方法
- run(); 線程在被調度時執行的操做
- String getName() 返回線程的名稱
- void setName(String name) : 設置該線程的名稱
- static Thread currentThread(): 返回當前線程。在Thead子類中就是this ,一般用於主線程和Runable實現類
- static void yied():線程讓步
- 暫停當前正在執行的線程,把執行機會讓給優先級相同或更高的線程
- 若隊列中沒有同優先級的線程,忽略此方法
- join() 當某個程序執行流中調用其餘線程的join()方法時,調用線程將被阻塞,直到join()方法加入的join線程執行完畢爲止
- 低優先級的線程也能夠得到執行
- static void sleep(long millis): 指定時間:毫秒
- 令當前活動線程在指定時間段內放棄對CPU控制,使其餘線程有機會被執行,時間到後重排隊。
- 拋出InterruptedException異常
- stop() 強制線程生命期結束,不推薦使用
- boolean isAlive(): 返回boolean 判斷線程是否還活着
package com.zhanghl.service; /* * 測試Thread類中的經常使用方法: * 1.start() :啓動線程,並執行對象的run()方法 * 2.run(): 一般須要重寫Thread類中的此方法,將建立的線程要執行的操做聲明再此方法中 * 3.currentThread(): 返回當前代碼執行的線程,靜態方法 * 4.getName():獲取當前線程的方法 * 5.setName(): 設置當前線程的方法 * 6.yield() 線程讓步 * 7.join() 在線程A中調用線程B的join(),此時線程A進入阻塞狀態, * 直到線程B徹底執行完之後,線程A纔會結束阻塞狀態 * 8.stop() 強制線程生命週期中止。不推薦使用,已過期 * 9.sleep(long millitime) 讓當前線程睡眠指定的millitime毫秒,在指定的millitime毫秒時間內,當前線程時阻塞裝 * 10. isAlive() 判斷當前線程是否存活 * */ public class ThreadMethodTest { public static void main(String[] args) { /*構造器方式命名*/ HelloThread h1 = new HelloThread("線程1"); //h1.setName("線程一"); h1.start(); /*給主線程命名*/ Thread.currentThread().setName("主線程"); for (int i = 0; i < 100; i++) { if(i%2==0){ System.out.println(Thread.currentThread().getName()+" : "+ i); } /*當i==20時 讓子線程 h1 先執行 ,執行完畢再回到主線程*/ if (i==20){ try { h1.join(); } catch (InterruptedException e) { e.printStackTrace(); } } } System.out.println("h1.isAlive()"+h1.isAlive()); } } class HelloThread extends Thread{ @Override public void run() { for (int i = 0; i < 100; i++) { if(i%2!=0){ try { //睡眠1秒 sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" : "+ i); } /*yield釋放執行權*/ /*if(i%10==0){ this.yield(); }*/ } } public HelloThread(){} /*利用Thread 類中 使用名稱實例化的方法*/ public HelloThread(String name){ super(name); } }