一 線程的基本概念java
線程是一個程序內部的順序控制流.一個進程至關於一個任務,一個線程至關於一個任務中的一條執行路徑.;多進程:在操做系統中能同時運行多個任務(程序);多線程:在同一個應用程序中有多個順序流同時執行;Java的線程是經過java.lang.Thread類來實現的;JVM啓動時會有一個由主方法(public static void main(){})所定義的線程;能夠經過建立Thread的實例來建立新的線程;每一個線程都是經過某個特定Thread對象所對應的方法run()來完成其操做的,方法run()稱爲線程體,經過調用Thread類的start()方法來啓動一個線程。多線程
二 線程的建立和啓動dom
能夠有兩種方式建立新的線程:
第一種:
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方法如:ide
class MyThread extends Thread { public void run() {...} }
2.而後生成該類的對象:
MyThread myThread = new MyThread();this
三 線程控制的基本方法操作系統
isAlive():判斷線程是否還"活"着
getPriority():得到線程的優先級數值
setPriority():設置線程的優先級數值
Thread.sleep():將當前線程睡眠指定毫秒數
join():調用某線程的該方法,將當前線程與該線程"合併",即等待該線程結束,再恢復當前線程的運行
yield():讓出cpu,當前線程進入就緒隊列等待調度
wait():當前線程進入對象的wait pool
notify()/notifyAll():喚醒對象的wait pool中的一個/全部等待線程線程
四 線程同步code
實現生產者消費者問題來講明線程問題,舉例以下所示:
對象
/** * 生產者消費者問題 */ 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(); } } } }