熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

Java線程的概念與原理

2022-06-13   來源: Java高級技術 

  一操作系統中線程和進程的概念

  現在的操作系統是多任務操作系統多線程是實現多任務的一種方式

  進程是指一個內存中運行的應用程序每個進程都有自己獨立的一塊內存空間一個進程中可以啟動多個線程比如在Windows系統中一個運行的exe就是一個進程線程是指進程中的一個執行流程一個進程中可以運行多個線程比如javaexe進程中可以運行很多線程線程總是屬於某個進程進程中的多個線程共享進程的內存同時執行是人的感覺在線程之間實際上輪換執行

  二Java中的線程

  在Java中線程指兩件不同的事情

  javalangThread類的一個實例

  線程的執行

  使用javalangThread類或者javalangRunnable接口編寫代碼來定義實例化和啟動新線程一個Thread類實例只是一個對象像Java中的任何其他對象一樣具有變量和方法生死於堆上Java中每個線程都有一個調用棧即使不在程序中創建任何新的線程線程也在後台運行著一個Java應用總是從main()方法開始運行mian()方法運行在一個線程內它被稱為主線程一旦創建一個新的線程就產生一個新的調用棧線程總體分兩類用戶線程和守候線程

  當所有用戶線程執行完畢的時候JVM自動關閉但是守候線程卻不獨立於JVM守候線程一般是由操作系統或者用戶自己創建的

  ———————————MultiTjava——————————————————————

  class MultiThread

  {

  public static void main(String[] args)

  {

  MyThread mt=new MyThread();

  //mtsetDaemon(true);//設定為後台線程main進程結束時後台進程也跟著結束

  //mtsetPriority(ThreadMAX_PRIORITY); //設定線程優先級MAX_PRIORITY為MIN_PRIORITY為NORM_PRIORITY為

  //設定為最高優先級後程序運行時mt線程一直運行強制終止時main線程才運行

  //設定為最高優先級的線程無論有無yield();線程總一直運行直到強制終止時main和mt線程交替運行

  mtstart();

  int index=;

  while(true) //顯示結果與教程不同

  {

  if(index++==)

  break;

  Systemoutprintln(main:+ThreadcurrentThread()getName()); //獲取線程名字

  }

  }

  }

  class MyThread extends Thread

  {

  public void run()

  {

  while(true)

  {

  Systemoutprintln(getName());

  yield(); //允許當前線程停止轉去執行其他線程靜態方法

  //mt進程執行時切換到main進程main進程執行一段時間後

  //切換進程到mtmt執行完獲取名字後返回到main進程

  }

  }

  }

  //一個長時間處於等待狀態的線程也有可能被線程調度器調度從而運行

  //打破高優先級線程始終獲有運行時間的狀態

  ——————————————————————————————————————

  ——————————MultiThreadjava———————————————————————

  class MultiThread

  {

  public static void main(String[] args)

  {

  MyThread mt=new MyThread();

  //new Thread(mt)start();   //創建多個同樣的線程訪問同一個變量index若MyThread采用繼承Thread方式則無法共享同一個變量

  //new Thread(mt)start();

  //new Thread(mt)start();

  //new Thread(mt)start();

  mtgetThread()start(); //也可以采用內部類的方式共享訪問同一個變量

  mtgetThread()start();

  mtgetThread()start();

  mtgetThread()start();

  //mtsetDaemon(true);//設定為後台線程main進程結束時後台進程也跟著結束

  //mtsetPriority(ThreadMAX_PRIORITY); //設定線程優先級MAX_PRIORITY為MIN_PRIORITY為NORM_PRIORITY為

  //設定為最高優先級後程序運行時mt線程一直運行強制終止時main線程才運行

  //設定為最高優先級的線程無論有無yield();線程總一直運行直到強制終止時main和mt線程交替運行

  //mtstart();

  int index=;

  while(true) //顯示結果與教程不同

  {

  // if(index++==)

  //   break;

  Systemoutprintln(main:+ThreadcurrentThread()getName()); //獲取線程名字

  }

  }

  }

  class MyThread //implements Runnable //extends Thread //使用外部類的方式

  //使用內部類完成使用Runnable接口才能完成的兩個功能 a創建多個線程b訪問同一個變量

  {

  int index=;

  private class InnerThread extends Thread //不想讓外部訪問其實現方法加上private

  {

  public void run()

  {

  while(true)

  {

  Systemoutprintln(ThreadcurrentThread()getName()+:+index++);

  }

  }

  }

  Thread getThread()

  {

  return new InnerThread();

  }

  /*

  public void run()

  {

  while(true)

  {

  Systemoutprintln(ThreadcurrentThread()getName()+:+index++);

  //yield(); //允許當前線程停止轉去執行其他線程靜態方法

  //mt進程執行時切換到main進程main進程執行一段時間後

  //切換進程到mtmt執行完獲取名字後返回到main進程

  }

  }

  */

  }

  //一個長時間處於等待狀態的線程也有可能被線程調度器調度從而運行

  //打破高優先級線程始終獲有運行時間的狀態

  //如果不需要修改Thread類的除了run方法外的其他方法選用implements Runnable

  ———————————————————————————————————————

  ———————————TicketsSystemjava———————————————————

  //多線程實現火車票的售票系統 用同步塊或著同步方法

  class TicketsSystem

  {

  public static void main(String[] args)    //運行結果與教程中不同不完全順序每次運行順序都不完全一樣

  {

  SellThread st=new SellThread();//創建四個線程訪問同一變量tickets

  // 錯 SellThread st=new SellThread();//若采用創建四個對象的方式則每個對象中都有張票

  new Thread(st)start();    //b為false用的同步方法    | //同步方法與同步塊共用中顯示的是只調用了同步塊而同步方法未被調用

  //b為true用的同步塊     | //原因啟動第一個線程後CPU時間片沒有到期線程沒有立即運行接著執行b=true

  //               | //解決辦法啟動第一個線程後執行一個睡眠時間讓CPU時間片到期

  try

  {

  Threadsleep();

  }

  catch(Exception e)

  {

  eprintStackTrace();

  }

  stb=true;

  new Thread(st)start();

  //new Thread(st)start();

  //new Thread(st)start();

  }

  }

  class SellThread implements Runnable   //程序有點小問題當剩下最後一張票時四個線程都運行可能會出現票數為(系統長時間運行時)

  //可加上一個靜態方法sleep();它會拋出異常

  {

  int tickets=;

  //Object obj=new Object();//也可以聲明一個Thread對象

  Thread th=new Thread();

  boolean b=false;

  public void run()

  {

  if(b==false)

  {

  while(true)

  sell();

  }

  else

  {

  while(true)

  {            //同步方法利用的是this所代表的對象的鎖

  synchronized(this) //采用同步後顯示正確此方法兩步聲明Thread對象用synchronized把原方法括起來

  {            //這裡換th為this

  ///*

  if(tickets>)

  {

  try

  {

  Threadsleep();

  }

  catch(Exception e)

  {

  eprintStackTrace();

  }

  Systemoutprintln(th +ThreadcurrentThread()getName()+ sell tickets:+tickets);

  tickets;

  }

  //*/

  }

  }

  }

  }

  public synchronized void sell() //每個class也有一個鎖是這個class所對應的class對象的鎖(監視器)

  {

  if(tickets>)

  {

  try

  {

  Threadsleep();

  }

  catch(Exception e)

  {

  eprintStackTrace();

  }

  Systemoutprintln(sell +ThreadcurrentThread()getName()+ sell tickets:+tickets);

  tickets;

  }

  }

  }

  ————————————————————————————————————————

  ———————————TestWNjava————————————————————

  class Test

  {

  public static void main(String[] args)

  {

  Queue q=new Queue();

  Producer p=new Producer(q);

  Consumer c=new Consumer(q);

  pstart();

  cstart();

  }

  }

  class Producer extends Thread

  {

  Queue q;

  Producer(Queue q)

  {

  thisq=q;

  }

  public void run()

  {

  for(int i=;i<;i++)

  {

  qput(i);

  Systemoutprintln(Producer put: +i);

  }

  }

  }

  class Consumer extends Thread

  {

  Queue q;

  Consumer(Queue q)

  {

  thisq=q;

  }

  public void run()

  {

  while(true)

  {

  Systemoutprintln(Consumer get: +qget());

  }

  }

  }

  class Queue   //waitnotify方法必須用在同步方法中要加上關鍵字synchronized

  {

  int value;

  boolean bFull=false;

  public synchronized void put(int i)

  {

  if(!bFull)

  {

  value=i;

  bFull=true;

  notify();

  }

  try

  {

  wait();

  }

  catch(Exception e)

  {

  eprintStackTrace();

  }

  }

  public synchronized int get()

  {

  if(!bFull)

  {

  try

  {

  wait();

  }

  catch(Exception e)

  {

  eprintStackTrace();

  }

  }

  bFull=false;

  notify();

  return value;

  }

  }

  ————————————————————————————————————

  ————————————TestThreadjava———————————————————————

  class TestThread

  {

  public static void main(String[] args)

  {

  Thread t=new Thread();

  tstart();

  int index=;

  while(true)

  {

  if(index++==)

  {

  tstopThread();

  tinterrupt(); //讓線程終止

  break;

  }

  Systemoutprintln(ThreadcurrentThread()getName());

  }

  Systemoutprintln(main() exit);

  }

  }

  class Thread extends Thread

  {

  private boolean bStop=false;

  public synchronized void run()

  {

  while(!bStop)

  {

  try

  {

  wait(); //加入wait後main線程結束時程序還未終止原因是Thread的線程調用wait方法進入對象的等待隊列中需要notify方法將它喚醒

  }

  catch(Exception e)

  {

  //eprintStackTrace();

  if(bStop)

  return;

  }

  Systemoutprintln(getName());

  }

  }

  public void stopThread()

  {

  bStop=true;

  }

  }

  ——————————————————————————————————————


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27407.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.