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