Ⅰ java 多線程有幾種實現方法
1、繼承Thread類實現多線程
繼承Thread類的方法盡管被我列為一種多線程實現方式,但Thread本質上也是實現了Runnable介面的一個實例,它代表一個線程的實例,並且,啟動線程的唯一方法就是通過Thread類的start()實例方法。start()方法是一個native方法,它將啟動一個新線程,並執行run()方法。這種方式實現多線程很簡單,通過自己的類直接extend Thread,並復寫run()方法,就可以啟動新線程並執行自己定義的run()方法。例如:
[java] view plain
public class MyThread extends Thread {
public void run() {
System.out.println("MyThread.run()");
}
}
在合適的地方啟動線程如下:
[java] view plain
MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
myThread1.start();
myThread2.start();
2、實現Runnable介面方式實現多線程
如果自己的類已經extends另一個類,就無法直接extends Thread,此時,必須實現一個Runnable介面,如下:
[java] view plain
public class MyThread extends OtherClass implements Runnable {
public void run() {
System.out.println("MyThread.run()");
}
}
為了啟動MyThread,需要首先實例化一個Thread,並傳入自己的MyThread實例:
[java] view plain
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
事實上,當傳入一個Runnable target參數給Thread後,Thread的run()方法就會調用target.run(),參考JDK源代碼:
[java] view plain
public void run() {
if (target != null) {
target.run();
}
}
3、使用ExecutorService、Callable、Future實現有返回結果的多線程
ExecutorService、Callable、Future這個對象實際上都是屬於Executor框架中的功能類。想要詳細了解Executor框架的可以訪問http://www.javaeye.com/topic/366591 ,這裡面對該框架做了很詳細的解釋。返回結果的線程是在JDK1.5中引入的新特徵,確實很實用,有了這種特徵我就不需要再為了得到返回值而大費周折了,而且即便實現了也可能漏洞百出。
可返回值的任務必須實現Callable介面,類似的,無返回值的任務必須Runnable介面。執行Callable任務後,可以獲取一個Future的對象,在該對象上調用get就可以獲取到Callable任務返回的Object了,再結合線程池介面ExecutorService就可以實現傳說中有返回結果的多線程了。下面提供了一個完整的有返回結果的多線程測試例子,在JDK1.5下驗證過沒問題可以直接使用。
Ⅱ java多線程如何創建多個多線程
Java 多線程的同步依靠的是對象鎖機制,這個問題需要我們不斷的學習相關的問題。下面我們就來詳細的學習下如何才能更好的進行具體內容的使用。synchronized關鍵字的背後就是利用了封鎖來實現對共享資源的互斥訪問。
下面以一個簡單的實例來進行對比分析。實例要完成的工作非常簡單,就是創建10個線程,每個線程都列印從0到99這100個數字,我們希望線程之間不會出現交叉亂序列印,而是順序地列印。
先來看第一段代碼,這里我們在run()方法中加入了synchronized關鍵字,希望能對run方法進行互斥訪問,但結果並不如我們希望那樣,這是因為這里synchronized鎖住的是this對象,即當前運行線程對象本身。 Java 多線程代碼中創建了10個線程,而每個線程都持有this對象的對象鎖,這不能實現線程的同步。
Java多線程代碼如下
1.package com.vista;
2.class MyThread implements java.lang.Runnable
3.{
4.private int threadId;
5.public MyThread(int id)
6.{
7.this.threadId = id;
8.}
9.@Override
10.public synchronized void run()
11.{
12.for (int i = 0; i < 100; ++i)
13.{
14.System.out.println("Thread ID: " + this.threadId + " : " + i);
15.}
16.}
17.}
18.public class ThreadDemo
19.{
20./**
21.* @param args
22.* @throws InterruptedException
23.*/
24.public static void main(String[] args) throws InterruptedException
25.{
26.for (int i = 0; i < 10; ++i)
27.{
28.new Thread(new MyThread(i)).start();
29.Thread.sleep(1);
30.}
31.}
32.}
以上就是對Java多線程的詳細代碼介紹。
Ⅲ java多線程有幾種實現方法
繼承Thread類來實現多線程:
當我們自定義的類繼承Thread類後,該類就為一個線程類,該類為一個獨立的執行單元,線程代碼必須編寫在run()方法中,run方法是由Thread類定義,我們自己寫的線程類必須重寫run方法。
run方法中定義的代碼為線程代碼,但run方法不能直接調用,如果直接調用並沒有開啟新的線程而是將run方法交給調用的線程執行
要開啟新的線程需要調用Thread類的start()方法,該方法自動開啟一個新的線程並自動執行run方法中的內容
*java多線程的啟動順序不一定是線程執行的順序,各個線程之間是搶佔CPU資源執行的,所有有可能出現與啟動順序不一致的情況。
CPU的調用策略:
如何使用CPU資源是由操作系統來決定的,但操作系統只能決定CPU的使用策略不能控制實際獲得CPU執行權的程序。
線程執行有兩種方式:
1.搶占式:
目前PC機中使用最多的一種方式,線程搶佔CPU的執行權,當一個線程搶到CPU的資源後並不是一直執行到此線程執行結束,而是執行一個時間片後讓出CPU資源,此時同其他線程再次搶佔CPU資源獲得執行權。
2.輪循式;
每個線程執行固定的時間片後讓出CPU資源,以此循環執行每個線程執行相同的時間片後讓出CPU資源交給下一個線程執行。
Ⅳ java中實現runnable介面多線程技術,用五個線程,生成100個1到1000的隨機數
在Java中,使用Runnable介面實現多線程技術,可以有效提高程序的並發處理能力。下面是一個簡單的例子,通過創建五個線程,每個線程生成1到1000之間的隨機數。
我們定義了一個名為Main的類,其中包含一個靜態變數num,用於計數隨機數的生成次數。在main方法中,我們創建了五個Thread對象,每個線程實例化了RandomRunnable類的一個實例,並啟動了它們。
RandomRunnable類實現了Runnable介面,擁有一個名為name的字元串變數和一個run方法。run方法中包含了生成隨機數的邏輯。通過調用Main類的add方法,每個線程可以向控制台輸出隨機數。
Main類中定義了add方法,用於在控制台列印隨機數。add方法中使用了synchronized關鍵字,確保在同一時間只有一個線程能夠訪問和修改num變數,避免了線程間的數據競爭。
此外,我們還定義了getNum方法,用於獲取當前的計數值。通過這種方式,每個線程可以判斷是否需要生成新的隨機數。
通過這種方式,我們可以有效地利用多線程技術,在多個線程之間分配任務,提高程序的執行效率。
需要注意的是,雖然這個例子展示了如何使用Runnable介面創建多線程,但實際應用中還需要考慮線程安全和其他並發問題,以確保程序的穩定性和可靠性。
通過這個簡單的例子,我們可以了解如何使用Java的多線程技術,實現並發程序設計。希望這個例子能夠幫助大家更好地理解和應用多線程編程。
在實際開發過程中,我們還可以通過增加更多的線程或者優化演算法來進一步提高程序的並發性能。同時,還需要注意線程之間的通信和同步問題,以確保程序的正確性和高效性。
總之,Java中的多線程技術為程序開發提供了強大的支持。通過合理地設計和實現多線程程序,我們可以充分利用計算機的多核處理能力,提高程序的運行效率。
最後,希望這個例子能夠為大家提供一些啟示和幫助。如果有任何問題或者需要進一步的幫助,請隨時提問。謝謝大家!
Ⅳ Java涓鍏充簬濡備綍瀹炵幇澶氱嚎紼嬫秷鎮闃熷垪鐨勫疄渚(java澶氱嚎紼嬮氫俊)
java涓鐨勬秷鎮闃熷垪
娑堟伅闃熷垪鏄綰跨▼闂撮氳鐨勬墜孌碉細
importjava.util.*
publicclassMsgQueue{
privateVectorqueue=null;
publicMsgQueue(){
queue=newVector();
}
publicvoidsend(Objecto)
{
queue.addElement(o);
}
publicObjectrecv()
{
if(queue.size()==0)
returnnull;
Objecto=queue.();
queue.(0);//orqueue[0]=nullcanalsowork
returno;
}
}
鍥犱負java涓鏄痩ockedbyobject鐨勬墍浠ユ坊鍔犲氨鍙浠ョ敤浜庣嚎紼嬪悓姝ラ攣瀹氬硅薄
鍙浠ヤ綔涓哄氱嚎紼嬪勭悊澶氫換鍔$殑瀛樻斁task鐨勯槦鍒椼備粬鐨刢lient鍖呮嫭灝佽呭ソ鐨則ask綾諱互鍙妕hread綾
Java鐨勫氱嚎紼-綰跨▼闂寸殑閫氫俊2009-08-2521:58
1.綰跨▼鐨勫嚑縐嶇姸鎬
綰跨▼鏈夊洓縐嶇姸鎬侊紝浠諱綍涓涓綰跨▼鑲瀹氬勪簬榪欏洓縐嶇姸鎬佷腑鐨勪竴縐嶏細
1)浜х敓錛圢ew錛夛細綰跨▼瀵硅薄宸茬粡浜х敓錛屼絾灝氭湭琚鍚鍔錛屾墍浠ユ棤娉曟墽琛屻傚傞氳繃new浜х敓浜嗕竴涓綰跨▼瀵硅薄鍚庢病瀵瑰畠璋冪敤start()鍑芥暟涔嬪墠銆
2)鍙鎵ц岋紙Runnable錛夛細姣忎釜鏀鎸佸氱嚎紼嬬殑緋葷粺閮芥湁涓涓鎺掔▼鍣錛屾帓紼嬪櫒浼氫粠綰跨▼奼犱腑閫夋嫨涓涓綰跨▼騫跺惎鍔ㄥ畠銆傚綋涓涓綰跨▼澶勪簬鍙鎵ц岀姸鎬佹椂錛岃〃紺哄畠鍙鑳芥e勪簬綰跨▼奼犱腑絳夊緟鎺掓帓紼嬪櫒鍚鍔ㄥ畠錛涗篃鍙鑳藉畠宸叉e湪鎵ц屻傚傛墽琛屼簡涓涓綰跨▼瀵硅薄鐨剆tart()鏂規硶鍚庯紝綰跨▼灝卞勪簬鍙鎵ц岀姸鎬侊紝浣嗘樉鑰屾槗瑙佺殑鏄姝ゆ椂綰跨▼涓嶄竴瀹氭e湪鎵ц屼腑銆
3)姝諱骸錛圖ead錛夛細褰撲竴涓綰跨▼姝e父緇撴潫錛屽畠渚垮勪簬姝諱骸鐘舵併傚備竴涓綰跨▼鐨剅un()鍑芥暟鎵ц屽畬姣曞悗綰跨▼灝辮繘鍏ユ諱骸鐘舵併
4)鍋滄粸錛圔locked錛夛細褰撲竴涓綰跨▼澶勪簬鍋滄粸鐘舵佹椂錛岀郴緇熸帓紼嬪櫒灝變細蹇界暐瀹冿紝涓嶅瑰畠榪涜屾帓紼嬨傚綋澶勪簬鍋滄粸鐘舵佺殑綰跨▼閲嶆柊鍥炲埌鍙鎵ц岀姸鎬佹椂錛屽畠鏈夊彲鑳介噸鏂版墽琛屻傚傞氳繃瀵逛竴涓綰跨▼璋冪敤wait()鍑芥暟鍚庯紝綰跨▼灝辮繘鍏ュ仠婊炵姸鎬侊紝鍙鏈夊綋涓ゆ″硅ョ嚎紼嬭皟鐢╪otify鎴杗otifyAll鍚庡畠鎵嶈兘涓ゆ″洖鍒板彲鎵ц岀姸鎬併
2.classThread涓嬬殑甯哥敤鍑芥暟鍑芥暟
2.1suspend()銆乺esume()
1)閫氳繃suspend()鍑芥暟錛屽彲浣跨嚎紼嬭繘鍏ュ仠婊炵姸鎬併傞氳繃suspend()浣跨嚎紼嬭繘鍏ュ仠婊炵姸鎬佸悗錛岄櫎闈炴敹鍒皉esume()娑堟伅錛屽惁鍒欒ョ嚎紼嬩笉浼氬彉鍥炲彲鎵ц岀姸鎬併
2)褰撹皟鐢╯uspend()鍑芥暟鍚庯紝綰跨▼涓嶄細閲婃斁瀹冪殑鈥滈攣鏍囧織鈥濄
渚11錛
classextendsThread{
publicstaticintshareVar=0;
public(Stringname){
super(name);
}
publicvoidrun(){
if(shareVar==0){
for(inti=0;i<5;i){
shareVar;
if(shareVar==5){
this.suspend();//錛1錛
}}}
else{
System.out.print(Thread.().getName());
System.out.println("shareVar="shareVar);
this.resume();//錛2錛
}}
}
publicclassTestThread{
publicstaticvoidmain(String[]args){
t1=new("t1");
t2=new("t2");
t1.start();//錛5錛
//t1.start();//錛3錛
t2.start();//錛4錛
}}