本篇內(nèi)容主要講解“Java多線程的相關(guān)機(jī)制是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Java多線程的相關(guān)機(jī)制是什么”吧!
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:空間域名、網(wǎng)頁(yè)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、縉云網(wǎng)站維護(hù)、網(wǎng)站推廣。
一 線程的基本概念
線程是一個(gè)程序內(nèi)部的順序控制流.一個(gè)進(jìn)程相當(dāng)于一個(gè)任務(wù),一個(gè)線程相當(dāng)于一個(gè)任務(wù)中的一條執(zhí)行路徑.;多進(jìn)程:在操作系統(tǒng)中能同時(shí)運(yùn)行多個(gè)任務(wù)(程序);多線程:在同一個(gè)應(yīng)用程序中有多個(gè)順序流同時(shí)執(zhí)行;Java的線程是通過(guò)java.lang.Thread類來(lái)實(shí)現(xiàn)的;JVM啟動(dòng)時(shí)會(huì)有一個(gè)由主方法(public static void main(){})所定義的線程;可以通過(guò)創(chuàng)建Thread的實(shí)例來(lái)創(chuàng)建新的線程;每個(gè)線程都是通過(guò)某個(gè)特定Thread對(duì)象所對(duì)應(yīng)的方法run()來(lái)完成其操作的,方法run()稱為線程體,通過(guò)調(diào)用Thread類的start()方法來(lái)啟動(dòng)一個(gè)線程。
二 線程的創(chuàng)建和啟動(dòng)
可以有兩種方式創(chuàng)建新的線程:
***種:
1.定義線程類實(shí)現(xiàn)Runnable接口
2.Thread myThread = new Thread(target); //target為Runnable接口類型
3.Runnable中只有一個(gè)方法:public void run();用以定義線程運(yùn)行體
4.使用Runnable接口可以為多個(gè)線程提供共享的數(shù)據(jù)
5.在實(shí)現(xiàn)Runnable接口的類的run()方法定義中可以使用Thread的靜態(tài)方法public static Thread currentThread();獲取當(dāng)前線程的引用
第二種:
1.可以定義一個(gè)Thread的子類并重寫其run方法如:
class MyThread extends Thread {
public void run() {...}
}
2.然后生成該類的對(duì)象:
MyThread myThread = new MyThread();
三 線程控制的基本方法
isAlive():判斷線程是否還"活"著
getPriority():獲得線程的優(yōu)先級(jí)數(shù)值
setPriority():設(shè)置線程的優(yōu)先級(jí)數(shù)值
Thread.sleep():將當(dāng)前線程睡眠指定毫秒數(shù)
join():調(diào)用某線程的該方法,將當(dāng)前線程與該線程"合并",即等待該線程結(jié)束,再恢復(fù)當(dāng)前線程的運(yùn)行
yield():讓出cpu,當(dāng)前線程進(jìn)入就緒隊(duì)列等待調(diào)度
wait():當(dāng)前線程進(jìn)入對(duì)象的wait pool
notify()/notifyAll():喚醒對(duì)象的wait pool中的一個(gè)/所有等待線程
四 線程同步
實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題來(lái)說(shuō)明線程問(wèn)題,舉例如下所示:
/** * 生產(chǎn)者消費(fèi)者問(wèn)題 */ package com.basic.thread; /** * @author johnston678 * * @version 2009-05-06 */ public class ProducerConsumer { /** * @param args */ public static void main(String[] args) { ProductBox pb = new ProductBox(); Producer p = new Producer(pb); Consumer c = new Consumer(pb); Thread pThread = new Thread(p); Thread cThread = new Thread(c); pThread.setPriority(Thread.MAX_PRIORITY); pThread.start(); cThread.start(); } } /** * 產(chǎn)品對(duì)象 * @author johsnton678 */ class Product { int id; public Product(int id) { super(); this.id = id; } public String toString(){ return "Product:" + id; } } /** * 產(chǎn)品盒對(duì)象 * @author johnston678 */ class ProductBox { Product[] productbox = new Product[6]; int index = 0; public ProductBox() { super(); } public synchronized void push(Product p) { while (index == productbox.length) { try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } this.notify(); productbox[index] = p; index ++; } public synchronized Product pop() { while (index == 0) { try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } this.notify(); index --; return productbox[index]; } } /** * 生產(chǎn)者 * @author johnston678 */ class Producer implements Runnable { ProductBox productbox = null; public Producer(ProductBox productbox) { super(); this.productbox = productbox; } @Override public void run() { // TODO Auto-generated method stub for (int i=0; i<10; i++) { Product p = new Product(i); productbox.push(p); System.out.println("produce:" + p); try { Thread.sleep((int)(Math.random() * 200)); } catch (InterruptedException e) { e.printStackTrace(); } } } } /** * 消費(fèi)者 * @author johnston678 */ class Consumer implements Runnable { ProductBox productbox = null; public Consumer(ProductBox productbox) { super(); this.productbox = productbox; } @Override public void run() { // TODO Auto-generated method stub for (int i=0; i<10; i++) { Product p = productbox.pop(); System.out.println("consume:" + p); try { Thread.sleep((int)(Math.random() * 1000)); } catch (InterruptedException e) { e.printStackTrace(); } } } }
到此,相信大家對(duì)“Java多線程的相關(guān)機(jī)制是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!