真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

實(shí)現(xiàn)多線程的方式有哪些

本篇文章為大家展示了實(shí)現(xiàn)多線程的方式有哪些,內(nèi)容簡明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的烏魯木齊網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

實(shí)現(xiàn)多線程的方式:

一,繼承Thread方式:

特點(diǎn):多線程多實(shí)例,無法實(shí)現(xiàn)資源的共享。

例子:

package com.demo.study.multithreading;

public class MyThread extends Thread{

 private int i = 10;
 // 可以自行定義鎖,也可以使用實(shí)例的鎖
 Object mutex = new Object();
 public void selltickets(){
 
 synchronized (mutex) {
 
 if(i>0){
  i--;
  //getName()獲取線程的名字
  System.out.println(Thread.currentThread().getName()+" :"+ i);
 }
 }
 }
 
 @Override
 public void run() {
 while(i>0){
  
  selltickets();
 }
 }
}

啟動(dòng)線程:

package com.demo.study.multithreading;

public class Test {

 public static void main(String[] args) {
//繼承Thread方式:多線程多實(shí)例,無法實(shí)現(xiàn)資源的共享
 MyThread myThread1 = new MyThread();
 MyThread myThread2 = new MyThread();
 //給線程命名
 myThread1.setName("線程1");
 myThread2.setName("線程2");
 myThread1.start();
 myThread2.start();
 }
}

運(yùn)行結(jié)果:

實(shí)現(xiàn)多線程的方式有哪些

二,實(shí)現(xiàn)Runnable方式:

特點(diǎn):多線程單實(shí)例,可實(shí)現(xiàn)資源的共享

例子:實(shí)現(xiàn)多窗口賣票:

package com.demo.study.multithreading;

public class MyThreadImpl implements Runnable {

 private int tickets = 10;

 public void sellTickets() {

 synchronized (MyThreadImpl.class) {
  if (tickets > 0) {

  tickets--;
  System.out.println(Thread.currentThread().getName() + "正在賣票,還剩下" + tickets + "張");
  }
 }
 }

 @Override
 public void run() {

 while (tickets > 0) {
  sellTickets();
  try {
  // 休眠一秒,讓執(zhí)行的效果更明顯
  Thread.sleep(100);
  } catch (InterruptedException e) {
  e.printStackTrace();
  }
 }
 }
}

啟動(dòng)線程:

注意:Thread中的start()方法是線程的就緒,而線程的啟動(dòng),需要等待CPU的調(diào)度(也就是所謂的線程搶資源);run()方法的方法體代表了線程需要完成的任務(wù),稱之為線程執(zhí)行體。

void start() 使該線程開始執(zhí)行;Java 虛擬機(jī)調(diào)用該線程的 run 方法。

package com.demo.study.multithreading;

public class Test {

 public static void main(String[] args) {

 //只創(chuàng)建一個(gè)實(shí)例
 MyThreadImpl threadImpl = new MyThreadImpl();
 //將上面創(chuàng)建的唯一實(shí)例放入多個(gè)線程中,Thread類提供了多個(gè)構(gòu)造方法,見下圖(構(gòu)造方法摘要)
 Thread thread1 = new Thread(threadImpl, "窗口1");
 Thread thread2 = new Thread(threadImpl, "窗口2");
 thread1.start();
 thread2.start();
 
 }
}
構(gòu)造方法摘要
Thread()
 分配新的Thread對(duì)象。

Thread(Runnable target)
 分配新的Thread對(duì)象。

Thread(Runnable target,String name)
 分配新的Thread對(duì)象。

Thread(String name)
 分配新的Thread對(duì)象。

Thread(ThreadGroup group,Runnable target)
 分配新的Thread對(duì)象。

Thread(ThreadGroup group,Runnable target,String name)
 分配新的Thread對(duì)象,以便將target作為其運(yùn)行對(duì)象,將指定的name作為其名稱,并作為group所引用的線程組的一員。

Thread(ThreadGroup group,Runnable target,String name, long stackSize)
 分配新的Thread對(duì)象,以便將target作為其運(yùn)行對(duì)象,將指定的name作為其名稱,作為group所引用的線程組的一員,并具有指定的堆棧大小。

Thread(ThreadGroup group,String name)
 分配新的Thread對(duì)象。

運(yùn)行結(jié)果:

實(shí)現(xiàn)多線程的方式有哪些

三、同步鎖與資源共享:

CPU可能隨機(jī)的在多個(gè)處于就緒狀態(tài)中的線程中進(jìn)行切換,這時(shí)就可能出現(xiàn)線程的安全問題;線程安全問題,其實(shí)是指多線程環(huán)境下對(duì)共享資源的訪問可能會(huì)引起此共享資源的不一致性,而解決安全問題則需要同步鎖的加入,執(zhí)行synchronized部分代碼的時(shí)候必須需要對(duì)象鎖,而一個(gè)對(duì)象只有一個(gè)鎖,只有執(zhí)行完synchronized里面的代碼后釋放鎖,其他線程才可以獲得鎖,那么就保證了同一時(shí)刻只有一個(gè)線程訪問synchronized里面的代碼。實(shí)現(xiàn)資源共享的關(guān)鍵是,只有一個(gè)實(shí)例,synchronized使用的是同一把鎖,用實(shí)例的鎖或者定義一個(gè)實(shí)例。這就需要使用實(shí)現(xiàn)Runnable接口的方式,實(shí)現(xiàn)多線程,這樣傳入的是一個(gè)實(shí)例。繼承Thread的方式,傳入的是多個(gè)實(shí)例,每個(gè)實(shí)例都有一個(gè)鎖,那就無法實(shí)現(xiàn)控制。

上述內(nèi)容就是實(shí)現(xiàn)多線程的方式有哪些,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)頁題目:實(shí)現(xiàn)多線程的方式有哪些
分享鏈接:http://weahome.cn/article/igghdd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部