您好,登錄后才能下訂單哦!
本篇內容主要講解“Java多線程的相關機制是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java多線程的相關機制是什么”吧!
一 線程的基本概念
線程是一個程序內部的順序控制流.一個進程相當于一個任務,一個線程相當于一個任務中的一條執行路徑.;多進程:在操作系統中能同時運行多個任務(程序);多線程:在同一個應用程序中有多個順序流同時執行;Java的線程是通過java.lang.Thread類來實現的;JVM啟動時會有一個由主方法(public static void main(){})所定義的線程;可以通過創建Thread的實例來創建新的線程;每個線程都是通過某個特定Thread對象所對應的方法run()來完成其操作的,方法run()稱為線程體,通過調用Thread類的start()方法來啟動一個線程。
二 線程的創建和啟動
可以有兩種方式創建新的線程:
***種:
1.定義線程類實現Runnable接口
2.Thread myThread = new Thread(target); //target為Runnable接口類型
3.Runnable中只有一個方法:public void run();用以定義線程運行體
4.使用Runnable接口可以為多個線程提供共享的數據
5.在實現Runnable接口的類的run()方法定義中可以使用Thread的靜態方法public static Thread currentThread();獲取當前線程的引用
第二種:
1.可以定義一個Thread的子類并重寫其run方法如:
class MyThread extends Thread {
public void run() {...}
}
2.然后生成該類的對象:
MyThread myThread = new MyThread();
三 線程控制的基本方法
isAlive():判斷線程是否還"活"著
getPriority():獲得線程的優先級數值
setPriority():設置線程的優先級數值
Thread.sleep():將當前線程睡眠指定毫秒數
join():調用某線程的該方法,將當前線程與該線程"合并",即等待該線程結束,再恢復當前線程的運行
yield():讓出cpu,當前線程進入就緒隊列等待調度
wait():當前線程進入對象的wait pool
notify()/notifyAll():喚醒對象的wait pool中的一個/所有等待線程
四 線程同步
實現生產者消費者問題來說明線程問題,舉例如下所示:
/** * 生產者消費者問題 */ 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(); } } /** * 產品對象 * @author johsnton678 */ class Product { int id; public Product(int id) { super(); this.id = id; } public String toString(){ return "Product:" + id; } } /** * 產品盒對象 * @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]; } } /** * 生產者 * @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(); } } } } /** * 消費者 * @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(); } } } }
到此,相信大家對“Java多線程的相關機制是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。