課程
/后端開發
/Java
/深入淺出Java多線程
兩個都可覆寫run 方法,什么時候一個類需要定義成線程,什么時候需要定義成runnable?這兩者各自的用法和區別俺沒搞清楚,求指點
2016-06-23
源自:深入淺出Java多線程 2-3
正在回答
這個等到后邊你學習了同步機制就知道了,實現的方式需要一個this關鍵字,而繼承的時候你在用this的時候,因為創建了多個實例化對象,就不能用this了,涉及到共享數據.共享數據只能有一個.這里給你看個代碼望采納:
package com.atguigu.java;
//使用實現Runnable接口的方式售票
/*
?* 此程序存在線程的安全問題,打印車票時,會出現重票,錯票
?* 1.線程安全問題存在的原因?
?* 由于一個線程在操作共享數據過程中,未執行完畢的情況下,另外的線程參與進來,導致
?* 共享數據存在了安全問題
?* 2.如何解決線程的安全問題?
?* 必須讓一個線程操作共享數據完畢以后,其他線程才有機會參與共享數據的操作.
?*?
?* 3.java如何實現線程的安全,線程的同步機制
?* 方式一:同步代碼塊
?* synchronized(同步監視器){
?* //需要被同步的代碼塊(即為操作共享數據的代碼)
?* }
?* 1.共享數據:多個線程共同操作的同一個數據(變量)
?* 2.同步監視器:由任何一個類的對象來充當.哪個線程 獲取此監視器,誰就執行大括號里被
?* ?同步的代碼.俗稱鎖.
?* 要求:所有的線程必須公用同一把鎖!
?* ?注:在實現的方式中,考慮同步的話,可以使用this來充當,但是在繼承的方式中,慎用this
?* 方法二:同步方法
?*/
class Window2 implements Runnable {
int ticket = 100;// 共享數據
//Object obj = new Object();
public void run() {
while (true) {
synchronized (this) {//this表示當前對象,本問題中為w
if (ticket > 0) {
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "票號為:" + ticket--);
public class TestWindow2 {
public static void main(String[] args) {
Window2 w1 = new Window2();
Thread t1 = new Thread(w1);
Thread t2 = new Thread(w1);
Thread t3 = new Thread(w1);
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t1.start();
t2.start();
t3.start();
在程序開發中只要是多線程肯定永遠以實現Runnable接口為主,因為實現Runnable接口相比繼承Thread類有如下好處:
避免點繼承的局限,一個類可以繼承多個接口。
適合于資源的共享
紅袖侍讀 提問者
舉報
帶你一起深入淺出多線程,掌握基礎,展望進階路線
1 回答關于Thread和Runnable
4 回答runnable和thread到底有啥區別啊,用的時候
1 回答thread與runnable有什么區別?
1 回答thread與runnable有什么區別
2 回答關于Thread類的getName()
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2016-08-04
這個等到后邊你學習了同步機制就知道了,實現的方式需要一個this關鍵字,而繼承的時候你在用this的時候,因為創建了多個實例化對象,就不能用this了,涉及到共享數據.共享數據只能有一個.這里給你看個代碼望采納:
package com.atguigu.java;
//使用實現Runnable接口的方式售票
/*
?* 此程序存在線程的安全問題,打印車票時,會出現重票,錯票
?* 1.線程安全問題存在的原因?
?* 由于一個線程在操作共享數據過程中,未執行完畢的情況下,另外的線程參與進來,導致
?* 共享數據存在了安全問題
?* 2.如何解決線程的安全問題?
?* 必須讓一個線程操作共享數據完畢以后,其他線程才有機會參與共享數據的操作.
?*?
?* 3.java如何實現線程的安全,線程的同步機制
?* 方式一:同步代碼塊
?* synchronized(同步監視器){
?* //需要被同步的代碼塊(即為操作共享數據的代碼)
?* }
?* 1.共享數據:多個線程共同操作的同一個數據(變量)
?* 2.同步監視器:由任何一個類的對象來充當.哪個線程 獲取此監視器,誰就執行大括號里被
?* ?同步的代碼.俗稱鎖.
?* 要求:所有的線程必須公用同一把鎖!
?* ?注:在實現的方式中,考慮同步的話,可以使用this來充當,但是在繼承的方式中,慎用this
?* 方法二:同步方法
?*?
?*/
class Window2 implements Runnable {
int ticket = 100;// 共享數據
//Object obj = new Object();
public void run() {
while (true) {
synchronized (this) {//this表示當前對象,本問題中為w
if (ticket > 0) {
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "票號為:" + ticket--);
}
}
}
}
}
public class TestWindow2 {
public static void main(String[] args) {
Window2 w1 = new Window2();
Thread t1 = new Thread(w1);
Thread t2 = new Thread(w1);
Thread t3 = new Thread(w1);
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t1.start();
t2.start();
t3.start();
}
}
2016-06-23
在程序開發中只要是多線程肯定永遠以實現Runnable接口為主,因為實現Runnable接口相比繼承Thread類有如下好處:
避免點繼承的局限,一個類可以繼承多個接口。
適合于資源的共享