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