Ⅰ 什麼是java多線程同步

因 為 多 線 程 給 你 提 ?; 了 程 序 的 異 步 執 行 的 功 能, 所 以 在 必 要 時 必 須 還 提 ?; 一 種 同 步 機 制。 例 如, 你 想 兩 個 線 程 通 訊 並 共 享 一 個 復 雜 的 數 據 結 構, 你 需 要 一 種 機 制 讓 他 們 相 互 牽 制 並 正 確 執 行。 為 這 個 目 的,Java用 一 種 叫 監 視 器(monitor)的 機 制 實 現 了 進 程 間 的 異 步 執 行。 可 以 將 監 視 器 看 作 是 一 個 很 小 的 盒 子, 它 只 能 容 納 一 個 線 程。 一 ?; 一 個 線 程 進 入 一 個 監 視 器, 所 有 其 他 線 程 必 須 等 到 第 一 個 線 程 退 出 監 視 器 後 才 能 進 入。 這 ?; 監 視 器 可 以 設 計 成 保 護 共 享 的 數 據 不 被 多 個 線 程 同 時 操 作。 大 多 數 多 線 程 系 統 將 這 ?; 監 視 器 設 計 成 對 象,Java提 ?; 了 一 種 更 清 晰 的 解 決 方 案。 沒 有Monitor類; 每 個 對 象 通 過 將 他 們 的 成 員 函 數 定 義 成synchronized來 定 義 自 己 的 顯 式 監 視 器, 一 ?; 一 個 線 程 執 行 在 一 個synchronized函 數 里, 其 他 任 何 線 程 都 不 能 調 用 同 一 個 對 象 的
synchronized函 數。

Ⅱ 什麼是Java多線程

1、進程和線程:
進程:正在進行的程序。每一個進程執行都有一個執行順序,該順序是一個執行路徑,或者叫一個控制單元。
線程:進程內部的一條執行路徑或者一個控制單元。
兩者的區別:
一個進程至少有一個線程
進程在執行過程中擁有獨立的內存單元,而多個線程共享內存;
2、什麼叫多線程:
一個進程中有多個線程,稱為多線程。
3、多線程的優勢:
解決了多部分同時運行的問題,提高效率
4、線程的弊端:
線程太多會導致效率的降低,因為線程的執行依靠的是CPU的來回切換。
5、實現多線程的方法:
實現多線程可以通過繼承Thread類和實現Runnable介面。

Ⅲ 告訴你什麼是java多線程定義及線程安全

網頁鏈接

舉個簡單易懂的例子,多線程相當於一條馬路上的多條車道,單車道行駛車輛速度較慢,且可能產生擁堵,多車道可緩解車速、擁堵情況。

線程是指進程中的一個執行流程,一個進程中可以運行1-n個線程。也可以說是在同一個進程內又可以執行多個任務,而每一個任務我們就可以看成是一個線程。

是程序的執行單元,執行路徑。是程序使用CPU的最基本的單位

如果程序只有一條執行路徑,那麼該程序就是單線程程序

如果程序有多條執行路徑,那麼該程序就是多線程程序

2、多線程的意義:

多線程不是為了提高程序的執行速度,而是為了提高程序的使用率。

多線程的執行都是為了搶佔CPU的使用率。

不能保證多線程程序會在什麼時候優先搶到使用權,所以線程的執行具有隨機性

3、多線程的優點:

充分利用硬體資源。由於線程是cpu的基本調度單位,所以如果是單線程,那麼最多隻能同時在一個處理器上運行,意味著其他的CPU資源都將被浪費。而多線程可以同時在多個處理器上運行,只要各個線程間的通信設計正確,那麼多線程將能充分利用處理器的資源。

多線程程序能將代碼量巨大,復雜的程序分成一個個簡單的功能模塊,每塊實現復雜程序的一部分單一功能,這將會使得程序的建模,測試更加方便,結構更加清晰,更加優雅

為了避免阻塞,單線程應用程序必須使用非阻塞I/O,這樣的I/O復雜性遠遠高於同步I/O,並且容易出錯。

4、多線程的缺點:

線程安全:由於統一進程下的多個線程是共享同樣的地址空間和數據的,又由於線程執行順序的不可預知性,一個線程可能會修改其他線程正在使用的變數,這一方面是給數據共享帶來了便利;另一方面,如果處理不當,會產生臟讀,幻讀等問題,好在Java提供了一系列的同步機制來幫助解決這一問題,例如內置鎖。

Ⅳ 什麼是JAVA的多線程

簡單,先回答什麼是線程:即程序的執行路徑,再回答多線程:多線程就是一個程序中有多條不同的執行路徑

JAVA多線程的優點:可以並發的執行多項任務,比如說你瀏覽網頁的同時還可以聽歌

Ⅳ java線程是什麼

一、操作系統中線程和進程的概念

現在的操作系統是多任務操作系統。多線程是實現多任務的一種方式。

進程是指一個內存中運行的應用程序,每個進程都有自己獨立的一塊內存空間,一個進程中可以啟動多個線程。比如在Windows系統中,一個運行的exe就是一個進程。

線程是指進程中的一個執行流程,一個進程中可以運行多個線程。比如java.exe進程中可以運行很多線程。線程總是屬於某個進程,進程中的多個線程共享進程的內存。

「同時」執行是人的感覺,在線程之間實際上輪換執行。

二、Java中的線程

在Java中,「線程」指兩件不同的事情:
1、java.lang.Thread類的一個實例;

2、線程的執行。

使用java.lang.Thread類或者java.lang.Runnable介面編寫代碼來定義、實例化和啟動新線程。

一個Thread類實例只是一個對象,像Java中的任何其他對象一樣,具有變數和方法,生死於堆上。

Java中,每個線程都有一個調用棧,即使不在程序中創建任何新的線程,線程也在後台運行著。

一個Java應用總是從main()方法開始運行,mian()方法運行在一個線程內,它被稱為主線程。

一旦創建一個新的線程,就產生一個新的調用棧。

線程總體分兩類:用戶線程和守候線程。

當所有用戶線程執行完畢的時候,JVM自動關閉。但是守候線程卻不獨立於JVM,守候線程一般是由操作系統或者用戶自己創建的

Ⅵ java中什麼叫做線程什麼叫多線程多線程的特點是什麼

線程的概念:Thread 每個正在系統上運行的程序都是一個進程。每個進程包含一到多個線程。進程也可能是整個程序或者是部分程序的動態執行。

多線程的概念: 多線程是為了同步完成多項任務,不是為了提高運行效率,而是為了提高資源使用效率來提高系統的效率。


多線程的特點:使用線程可以把占據長時間的程序中的任務放到後台去處理


用戶界面可以更加吸引人,這樣比如用戶點擊了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度 。


程序的運行速度可能加快 ·在一些等待的任務實現上如用戶輸入、文件讀寫和網路收發數據等,線程就比較有用了。


在這種情況下我們可以釋放一些珍貴的資源如內存佔用等等。

Ⅶ java 多線程是什麼

進程是程序在處理機中的一次運行。一個進程既包括其所要執行的指令,也包括了執行指令所需的系統資源,不同進程所佔用的系統資源相對獨立。所以進程是重量級的任務,它們之間的通信和轉換都需要操作系統付出較大的開銷。
線程是進程中的一個實體,是被系統獨立調度和分派的基本單位。線程自己基本上不擁有系統資源,但它可以與同屬一個進程的其他線程共享進程所擁有的全部資源。所以線程是輕量級的任務,它們之間的通信和轉換只需要較小的系統開銷。
Java支持多線程編程,因此用Java編寫的應用程序可以同時執行多個任務。Java的多線程機制使用起來非常方便,用戶只需關注程序細節的實現,而不用擔心後台的多任務系統。
Java語言里,線程表現為線程類。Thread線程類封裝了所有需要的線程操作控制。在設計程序時,必須很清晰地區分開線程對象和運行線程,可以將線程對象看作是運行線程的控制面板。在線程對象里有很多方法來控制一個線程是否運行,睡眠,掛起或停止。線程類是控制線程行為的唯一的手段。一旦一個Java程序啟動後,就已經有一個線程在運行。可通過調用Thread.currentThread方法來查看當前運行的是哪一個線程。

class ThreadTest{
public static void main(String args[]){
Thread t = Thread.currentThread();
t.setName("單線程"); //對線程取名為"單線程"
t.setPriority(8);
//設置線程優先順序為8,最高為10,最低為1,默認為5
System.out.println("The running thread: " + t);
// 顯示線程信息
try{
for(int i=0;i<3;i++){
System.out.println("Sleep time " + i);
Thread.sleep(100); // 睡眠100毫秒
}
}catch(InterruptedException e){// 捕獲異常
System.out.println("thread has wrong");
}
}
}

多線程的實現方法
繼承Thread類
可通過繼承Thread類並重寫其中的run()方法來定義線程體以實現線程的具體行為,然後創建該子類的對象以創建線程。
在繼承Thread類的子類ThreadSubclassName中重寫run()方法來定義線程體的一般格式為:
public class ThreadSubclassName extends Thread{
public ThreadSubclassName(){
..... // 編寫子類的構造方法,可預設
}
public void run(){
..... // 編寫自己的線程代碼
}
}
用定義的線程子類ThreadSubclassName創建線程對象的一般格式為:
ThreadSubclassName ThreadObject =
new ThreadSubclassName();
然後,就可啟動該線程對象表示的線程:
ThreadObject.start(); //啟動線程

應用繼承類Thread的方法實現多線程的程序。本程序創建了三個單獨的線程,它們分別列印自己的「Hello World!」。
class ThreadDemo extends Thread{
private String whoami;
private int delay;
public ThreadDemo(String s,int d){
whoami=s;
delay=d;
}
public void run(){
try{
sleep(delay);
}catch(InterruptedException e){ }
System.out.println("Hello World!" + whoami
+ " " + delay);
}
}
public class MultiThread{
public static void main(String args[]){
ThreadDemo t1,t2,t3;
t1 = new ThreadDemo("Thread1",
(int)(Math.random()*2000));
t2 = new ThreadDemo("Thread2",
(int)(Math.random()*2000));
t3 = new ThreadDemo("Thread3",
(int)(Math.random()*2000));
t1.start();
t2.start();
t3.start();
}
}

實現Runnable介面
編寫多線程程序的另一種的方法是實現Runnable介面。在一個類中實現Runnable介面(以後稱實現Runnable介面的類為Runnable類),並在該類中定義run()方法,然後用帶有Runnable參數的Thread類構造方法創建線程。
創建線程對象可用下面的兩個步驟來完成:
(1)生成Runnable類ClassName的對象
ClassName RunnableObject = new ClassName();
(2)用帶有Runnable參數的Thread類構造方法創建線程對象。新創建的線程的指針將指向Runnable類的實例。用該Runnable類的實例為線程提供 run()方法---線程體。
Thread ThreadObject = new Thread(RunnableObject);
然後,就可啟動線程對象ThreadObject表示的線程:
ThreadObject.start();
在Thread類中帶有Runnable介面的構造方法有:
public Thread(Runnable target);
public Thread(Runnable target, String name);
public Thread(String name);
public Thread(ThreadGroup group,Runnable target);
public Thread(ThreadGroup group,Runnable target,
String name);
其中,參數Runnable target表示該線程執行時運行target的run()方法,String name以指定名字構造線程,ThreadGroup group表示創建線程組。
用Runnable介面實現的多線程。
class TwoThread implements Runnable{
TwoThread(){
Thread t1 = Thread.currentThread();
t1.setName("第一主線程");
System.out.println("正在運行的線程: " + t1);
Thread t2 = new Thread(this,"第二線程");
System.out.println("創建第二線程");
t2.start();
try{
System.out.println("第一線程休眠");
Thread.sleep(3000);
}catch(InterruptedException e){
System.out.println("第一線程有錯");
}
System.out.println("第一線程退出");
}
public void run(){
try{
for(int i = 0;i < 5;i++){
System.out.println(「第二線程的休眠時間:」
+ i);
Thread.sleep(1000);
}
}catch(InterruptedException e){
System.out.println("線程有錯");
}
System.out.println("第二線程退出");
}
public static void main(String args[]){
new TwoThread();
}
}
程序運行結果如下:
正在運行的線程: Thread[第一主線程,5,main
創建第二線程
第一線程休眠
第二線程的休眠時間:0
第二線程的休眠時間:1
第二線程的休眠時間:2
第一線程退出
第二線程的休眠時間:3
第二線程的休眠時間:4
第二線程退出

Ⅷ 什麼是java多線程詳解

線程對象是可以產生線程的對象。比如在Java平台中Thread對象,Runnable對象。線程,是指正在執行的一個指點令序列。在java平台上是指從一個線程對象的start()開始,運行run方法體中的那一段相對獨立的過程。相比於多進程,多線程的優勢有:
(1)進程之間不能共享數據,線程可以;
(2)系統創建進程需要為該進程重新分配系統資源,故創建線程代價比較小;
(3)Java語言內置了多線程功能支持,簡化了java多線程編程。
一、創建線程和啟動
(1)繼承Thread類創建線程類
通過繼承Thread類創建線程類的具體步驟和具體代碼如下:
• 定義一個繼承Thread類的子類,並重寫該類的run()方法;
• 創建Thread子類的實例,即創建了線程對象;
• 調用該線程對象的start()方法啟動線程。
復制代碼
class SomeThead extends Thraad {
public void run() {
//do something here
}
}

public static void main(String[] args){
SomeThread oneThread = new SomeThread();
步驟3:啟動線程:
oneThread.start();
}
復制代碼
(2)實現Runnable介面創建線程類
通過實現Runnable介面創建線程類的具體步驟和具體代碼如下:
• 定義Runnable介面的實現類,並重寫該介面的run()方法;
• 創建Runnable實現類的實例,並以此實例作為Thread的target對象,即該Thread對象才是真正的線程對象。
復制代碼
class SomeRunnable implements Runnable {
public void run() {
//do something here
}
}
Runnable oneRunnable = new SomeRunnable();
Thread oneThread = new Thread(oneRunnable);
oneThread.start();
復制代碼
(3)通過Callable和Future創建線程
通過Callable和Future創建線程的具體步驟和具體代碼如下:
• 創建Callable介面的實現類,並實現call()方法,該call()方法將作為線程執行體,並且有返回值。
• 創建Callable實現類的實例,使用FutureTask類來包裝Callable對象,該FutureTask對象封裝了該Callable對象的call()方法的返回值。
• 使用FutureTask對象作為Thread對象的target創建並啟動新線程。
• 調用FutureTask對象的get()方法來獲得子線程執行結束後的返回值其中,Callable介面(也只有一個方法)定義如下:
復制代碼
public interface Callable {
V call() throws Exception;
}
步驟1:創建實現Callable介面的類SomeCallable(略);
步驟2:創建一個類對象:
Callable oneCallable = new SomeCallable();
步驟3:由Callable創建一個FutureTask對象:
FutureTask oneTask = new FutureTask(oneCallable);
注釋: FutureTask是一個包裝器,它通過接受Callable來創建,它同時實現了 Future和Runnable介面。
步驟4:由FutureTask創建一個Thread對象:
Thread oneThread = new Thread(oneTask);
步驟5:啟動線程:
oneThread.start();

Ⅸ 在java中單線程和多線程是什麼意思,他們有什麼區別,分別的作用是什麼

在一個程序中,這抄些獨立運行的程序片斷叫作「線程」(Thread),利用它編程的概念就叫作「多線程處理」。多線程處理一個常見的例子就是用戶界面。利用線程,用戶可按下一個按鈕,然後程序會立即作出響應,而不是讓用戶等待程序完成了當前任務以後才開始響應。簡單地說,就是說可以有多個任務同時進行。
單線程在程序執行時,所走的程序路徑按照連續順序排下來,前面的必須處理好,後面的才會執行。因此,針對前面舉的例子,必須等待程序完成了當前任務以後才能開始相應。

使用多線程訪問公共的資源時,容易引發線程安全性問題,因此針對這種需要使用線程同步機制來保護公共的資源。
單線程較多線程來說,就不會出現上訴問題,系統穩定、擴展性極強、軟體豐富。多用於點對點的服務。

Ⅹ Java多線程是什麼意思

Java多線程實現方式主要有三種:繼承Thread類、實現Runnable介面、使用ExecutorService、Callable、Future實現有返回結果的多線程。其中前兩種方式線程執行完後都沒有返回值,只有最後一種是帶返回值的。

1、繼承Thread類實現多線程
繼承Thread類的方法盡管被我列為一種多線程實現方式,但Thread本質上也是實現了Runnable介面的一個實例,它代表一個線程的實例,並且,啟動線程的唯一方法就是通過Thread類的start()實例方法。start()方法是一個native方法,它將啟動一個新線程,並執行run()方法。這種方式實現多線程很簡單,通過自己的類直接extend Thread,並復寫run()方法,就可以啟動新線程並執行自己定義的run()方法。例如:

代碼說明:
上述代碼中Executors類,提供了一系列工廠方法用於創先線程池,返回的線程池都實現了ExecutorService介面。
public static ExecutorService newFixedThreadPool(int nThreads)
創建固定數目線程的線程池。
public static ExecutorService newCachedThreadPool()
創建一個可緩存的線程池,調用execute 將重用以前構造的線程(如果線程可用)。如果現有線程沒有可用的,則創建一個新線程並添加到池中。終止並從緩存中移除那些已有 60 秒鍾未被使用的線程。
public static ExecutorService newSingleThreadExecutor()
創建一個單線程化的Executor。
public static ScheledExecutorService newScheledThreadPool(int corePoolSize)
創建一個支持定時及周期性的任務執行的線程池,多數情況下可用來替代Timer類。

總結:ExecutoreService提供了submit()方法,傳遞一個Callable,或Runnable,返回Future。如果Executor後台線程池還沒有完成Callable的計算,這調用返回Future對象的get()方法,會阻塞直到計算完成。