1.進程概述及多進程的意義[理解]php
2.線程的概述和多線程的意義[理解]java
3.JVM運行原理以及JVM啓動的線程探討[理解]安全
4.多線程程序實現的方式[掌握]網絡
5.線程調度多線程
6.線程控制併發
7.案例分析jvm
第一種方式的步驟: 1: 定義一個類,讓該類去繼承Thread類 2: 重寫run方法 3: 建立該類的對象 4: 啓動線程 public class ThreadDemo { public static void main(String[] args) { // 建立對象 MyThread t1 = new MyThread() ; MyThread t2 = new MyThread() ; // 啓動線程: 須要使用start方法啓動線程, 若是咱們在這裏調用的是run方法,那麼咱們只是把該方法做爲普通方法進行執行 // t1.run() ; // t1.run() ; t1.start() ; // 告訴jvm開啓一個線程調用run方法 // t1.start() ; // 一個線程只能被啓動一次 t2.start() ; } } public class MyThread extends Thread { @Override public void run() { for(int x = 0 ; x < 1000 ; x++) { System.out.println(x); } } }
實現多線程的第二中方式步驟: 1: 定義一個類,讓該類去實現Runnable接口 2: 重寫run方法 3: 建立定義的類的對象 4: 建立Thread的對象吧第三步建立的對象做爲參數傳遞進來 5: 啓動線程 public static void main(String[] args) { // 建立定義的類的對象 MyThread mt = new MyThread() ; // 建立Thread的對象吧第三步建立的對象做爲參數傳遞進來 Thread t1 = new Thread(mt , "張三") ; Thread t2 = new Thread(mt , "李四") ; // 啓動線程 t1.start() ; t2.start() ; } public class MyThread implements Runnable { @Override public void run() { for(int x = 0 ; x < 1000 ; x++) { System.out.println(Thread.currentThread().getName() + "---" + x); } } }
public class ThreadDemo { public static void main(String[] args) { /** * 需求:某電影院目前正在上映賀歲大片,共有100張票,而它有3個售票窗口售票,請設計一個程序模擬該電影院售票。 */ // 建立3個線程對象 SellTicktes t1 = new SellTicktes() ; SellTicktes t2 = new SellTicktes() ; SellTicktes t3 = new SellTicktes() ; // 設置名稱 t1.setName("窗口1") ; t2.setName("窗口2") ; t3.setName("窗口3") ; // 啓動線程 t1.start() ; t2.start() ; t3.start() ; } } public class SellTicktes extends Thread { private static int num = 100 ; @Override public void run() { /** * 定義總票數 * * 若是咱們把票數定義成了局部變量,那麼表示的意思是每個窗口出售了各自的100張票; 而咱們的需求是: 總共有100張票 * 而這100張票要被3個窗口出售; 所以咱們就不能把票數定義成局部變量,只能定義成成員變量 */ // 模擬售票 while(true) { if( num > 0 ) { System.out.println(Thread.currentThread().getName() + "正在出售" + (num--) + "張票"); } } } }
public class SellTicektesDemo { public static void main(String[] args) { // 建立SellTicektes對象 SellTicektes st = new SellTicektes() ; // 建立Thread對象 Thread t1 = new Thread(st , "窗口1") ; Thread t2 = new Thread(st , "窗口2") ; Thread t3 = new Thread(st , "窗口3") ; // 啓動線程 t1.start() ; t2.start() ; t3.start() ; } } public class SellTicektes implements Runnable { private static int num = 100 ; @Override public void run() { while(true) { if(num > 0) { System.out.println(Thread.currentThread().getName() + "正在出售第" + (num--) + "張票"); } } } }
public class ThreadDemo { public static void main(String[] args) { // 建立3個線程對象 SellTicktes t1 = new SellTicktes() ; SellTicktes t2 = new SellTicktes() ; SellTicktes t3 = new SellTicktes() ; // 設置名稱 t1.setName("窗口1") ; t2.setName("窗口2") ; t3.setName("窗口3") ; // 啓動線程 t1.start() ; t2.start() ; t3.start() ; } } public class SellTicktes extends Thread { private static int num = 100 ; @Override public void run() { // 模擬售票 while(true) { if( num > 0 ) { try { Thread.sleep(100) ; } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在出售" + (num--) + "張票"); } } } }
synchronized(對象){ 須要同步的代碼; }