-
線程的就緒狀態(tài)查看全部
-
線程的生命周期 創(chuàng)建 -> 就緒 -> 運行 -> (阻塞->解除阻塞->就緒->運行) ->消亡 創(chuàng)建狀態(tài):新建了一個線程對象,如Thread t = new Thread(); 就緒狀態(tài):調用線程的start()方法啟動線程后,線程就進入了就緒狀態(tài),此時線程只是進入了線程隊列,等待獲取cpu資源,具備了運行的條件,但并不一定已經(jīng)開始運行了,因為當前cpu可能在執(zhí)行別的線程. 運行狀態(tài):當線程獲取了cpu資源時就進入了運行狀態(tài),執(zhí)行線程的run方法. 消亡:一旦線程的run方法執(zhí)行完畢后線程將會消亡. 阻塞狀態(tài):當線程在運行狀態(tài)時,可能會遇到一些阻塞事件,此時當前線程會讓出cpu資源,暫停了自己的執(zhí)行,并且進入阻塞狀態(tài). 當阻塞解除時便會重新進入就緒狀態(tài),繼續(xù)進入線程隊列等待獲取cpu資源.當重新獲取了cpu資源后,會從上次已執(zhí)行的run方法代碼后繼續(xù)執(zhí)行. 阻塞事件:線程的sleep()方法、線程的join()方法等. 大多數(shù)情況下,線程是因為執(zhí)行完run方法就會進入終止狀態(tài),除非人為調用了stop方法.查看全部
-
/*創(chuàng)建線程的兩種方式: * 1.繼承Thread類 * 2.實現(xiàn)Runnable接口 * */ //創(chuàng)建一個線程類 class MyThread1 implements Runnable{ private int ticketsCount = 5; //一共有5張火車票 @Override public void run() { //如果ticketsCount不為0,說明還有火車票,可以繼續(xù)賣 while(ticketsCount > 0 ){ ticketsCount--; //Thread.currentThread().getName() 獲得當前線程的名字 System.out.println(Thread.currentThread().getName() +"賣了1張票,剩余票數(shù)為"+ticketsCount); } } } public class TicketsThread1 { public static void main(String[] args) { MyThread1 mt = new MyThread1(); //創(chuàng)建三個線程,來模擬三個售票窗口 Thread th1 = new Thread(mt,"窗口1"); Thread th2 = new Thread(mt,"窗口2"); Thread th3 = new Thread(mt,"窗口3"); //啟動三個線程,就是三個窗口開始賣票 th1.start(); th2.start(); th3.start(); } }查看全部
-
package com.createThread; //定義一個線程類 class MyThread extends Thread{ private int ticketsCount = 5; //一共有5張火車票 private String name; //窗口,就是線程的名字 public MyThread(String name){ this.name = name; } //創(chuàng)建啟動線程的方法 @Override public void run() { while(ticketsCount > 0){ ticketsCount--; //如果還有票,就賣掉一張 System.out.println(name +"賣了1張票,剩余票數(shù)為"+ticketsCount); } } } public class TicketsThread { public static void main(String[] args) { //創(chuàng)建3個線程,模擬三個窗口賣票 MyThread mt1 = new MyThread("窗口1"); MyThread mt2 = new MyThread("窗口2"); MyThread mt3 = new MyThread("窗口3"); //啟動這三個線程,就是窗口開始賣票 mt1.start(); mt2.start(); mt3.start(); } /* * 總共只有5張火車票,每個窗口賣了5次,結果賣出15張票,這是不合理的 * * */ }查看全部
-
創(chuàng)建線程的兩種方式的比較查看全部
-
在Java中一個子類可以實現(xiàn)多個接口,但只能繼承一個父類。單繼承 兩種創(chuàng)建線程方式的簡單比較:<br> 1:在Java世界中一個類可以同時實現(xiàn)多個接口但是只能集成一個類,這就是單繼承 2:使用繼承Thread類的方式來創(chuàng)建線程,不適合多個線程處理同一資源的情況,這種情況對于使用實現(xiàn)Runnable接口的方式創(chuàng)建的線程是適合的。查看全部
-
創(chuàng)建線程查看全部
-
創(chuàng)建線程查看全部
-
1.繼承 Thread 類 MyThread my = new MyThread(); my.start(); 2.實現(xiàn) Runable 接口:(代碼多出一行) MyThread my = new MyThread(); Thread thread = new Thread(my); thread.start(); 啟動線程調用start()方法[注:并沒有開始執(zhí)行],之后線程進入線程隊列中,等待cpu服務, 一旦獲取到時間片立即進入run()方法開始執(zhí)行,run()方法邏輯完成,本線程結束查看全部
-
線程分為兩類: 1、用戶線程:運行在前臺,執(zhí)行具體任務 如程序的主線程、連接網(wǎng)絡的子線程等都是用戶線程 2、守護線程:運行在后臺,為其他前臺線程服務(也就是某些線程的服務者) 特點:一旦所有的用戶線程都結束運行(沒有了守護的對象),守護線程會隨JVM一起結束工作 如:數(shù)據(jù)庫連接池中的監(jiān)測線程(監(jiān)測連接個數(shù)、監(jiān)測連接超時時間)、 JVM虛擬機啟動之后的監(jiān)測線程 最常見的還是垃圾回收線程 注:1.daemon(英文守護的意思)設置是否是守護線程,必須在start方法前調用 2.守護線程匯總產(chǎn)生的線程也是守護線程 3.不是所有的任務都能設置成守護線程,如讀寫操作、計算邏輯(也就是和實際業(yè)務邏輯相關的線程不能設置成守護線程)查看全部
-
阻塞(cpu被搶占) / /\\ / \ \// \ 創(chuàng)建(new)-->就緒(start)-->運行(run)-->終止(run執(zhí)行完)查看全部
-
兩者對比: 1:一個是Thread類,一個是Runnable接口;Runnable方式可以避免Thread方式由于Java單繼承性帶來的缺陷 2:Thread類: MyThread my = new MyThread(); my.start(); Runable 接口: MyThread my = new MyThread(); Thread thread = new Thread(my); 3:Runable代碼(實例)可以被多個線程共享,適合于多個線程處理同一資源(也就是說各個線程有公用信息<總票數(shù)>)的情況 MyThread my = new MyThread(); Thread thread = new Thread(my); thread.start(); Thread thread1 = new Thread(my);<-這里-> thread2.start();查看全部
-
1.繼承 Thread 類 MyThread my = new MyThread(); my.start(); 2.實現(xiàn) Runable 接口:(代碼多出一行) MyThread my = new MyThread(); Thread thread = new Thread(my); thread.start(); 啟動線程調用start()方法[注:并沒有開始執(zhí)行],之后線程進入線程隊列中,等待cpu服務, 一旦獲取到時間片立即進入run()方法開始執(zhí)行,run()方法邏輯完成,本線程結束查看全部
-
線程創(chuàng)建實現(xiàn)Runnable接口查看全部
-
線程創(chuàng)建繼承Thread類查看全部
舉報
0/150
提交
取消