jdk1.5之前利用的線程建立體例。
1、建立利用擔當Thread類并重寫run方式的體例實現,或者利用匿名內部類的體例。
生命周期的五種狀況 新建(new Thread) 當建立Thread類的一個實例(對象)時,此線程進入新建狀況(未被啟動)。 例如:Thread t1=new Thread(); 停當(runnable) 線程已經被啟動,正在期待被分派給CPU時候片,也就是說此時線程正在停當隊列中列隊等待獲得CPU資本。例如:t1.start(); 運行(running) 線程獲得CPU資本正在執行使命(run()方式),此時除非此線程主動拋卻CPU資本或者有優先級更高的線程進入,線程將一向運行到竣事。 滅亡(dead) 當線程執行完畢或被其它線程殺死,線程就進入滅亡狀況,這時線程不成能再進入停當狀況期待執行。 天然終止:正常運行run()方式后終止 異常終止:挪用stop()方式讓一個線程終止運行 堵塞(blocked) 因為某種原因導致正在運行的線程讓出CPU并暫停本身的執行,即進入堵塞狀況。 正在睡眠:用sleep(long t) 方式可使線程進入睡眠體例。一個睡眠著的線程在指心猿意馬的時候曩昔可進入停當狀況。 正在期待:挪用wait()方式。(挪用motify()方式回到停當狀況) 被另一個線程所梗阻:挪用suspend()方式。(挪用resume()方式恢復)
根基利用
package com.sgg.thread;
/**
* 多線程的建立。體例1擔當與Thread類
* 1.建立一個擔當與Thread的子類
* 2.重寫run方式,將此線程執行的操出聲明在run方式中
* 3.建立Thread子類對象
* 4.經由過程此對象挪用start()方式啟動線程
*
*/
public class TestThread {
public static void main(String[] args) {
//ConcurrentHashMap<Object, Object> objectObjectConcurrentHashMap = new ConcurrentHashMap<Object, Object>();
MyThread myThread = new MyThread();
myThread.start();
//利用匿名體例擔當
// new Thread(){
//
// @Override
// public void run() {
// for (int i = 0; i < 100; i++) {
// if (i%2 == 1 ){
// System.out.println(Thread.currentThread().getName()+":"+i);
// }
//
// if(i%20 == 0){
// //釋放CPU的執行權
// this.yield();
// }
//
// }
// }
// }.start();
for (int i = 0; i < 100; i++) {
if (i%2 == 1 ){
System.out.println(Thread.currentThread().getName()+":"+Thread.currentThread().getPriority()+":"+i);
}
if( i== 10){
try {
myThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println("myThread是否存活:"+myThread.isAlive());
}
}
//利用集當作體例
class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if (i%2 ==0 ){
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
public MyThread(){};
//建立時設置線程名字
public MyThread(String name){
//挪用java.lang.Thread.Thread(java.lang.String)
super(name);
}
}
常用方式界說
package com.sgg.thread;
/**
* 測試Thread類中常用的方式
* 1.strat() :啟動當火線程,并挪用當火線程的run()
* 2.run(): 凡是需要從頭Thread中的此方式,將建立的線程中所需的操作(也就是營業代碼)聲明在此方式中
* 3.currentThread(): 靜態方式,返回當前代碼的線程
* 4.getName():獲取當火線程的名字
* 5.setName():設置當火線程房名字
* 6.yield() :是否當火線程CPU的執行權
* 7.join() :在線程a中挪用線程b的join(),此時線程a就進入梗阻狀況,知道線程b執行完之后,線程a才竣事梗阻狀況
* 8.stop() :已過時,當執行此方式時,強制竣事當火線程。
* 9.sleep(long millitime) :讓當火線程“睡眠”指心猿意馬的millitime毫秒,在指心猿意馬的millitime毫秒時候內,當火線程是梗阻狀況
* 10.isAlive() :判定當火線程是否存活
*
*
* 線程的優先級
* 1.MAX_PRIORITY = 10;
* 2.NORM_PRIORITY = 5;
* 3.MIN_PRIORITY = 1;
*若何獲取和設置當火線程的優先級
* 1.getPriority()
* 2.setPriority(int newPriority) :啟動之前設置線程的優先級
*
* 申明:高優先級的線程要搶占低優先級線程CPU的執行權。可是只是從概率上講,高優先級的線程高概率下被執行。并不料味著高優先級線程執行無缺,低優先級的線程才會執行。
*/
public class ThreadMethodTest {
public static void main(String[] args) {
}
}
實例操練
package com.sgg.thread;
class MyThread extends Thread {
private static int ticket = 1000;
@Override
public void run() {
while (true) {
if (!show()) {
break;
}
;
}
}
private static synchronized boolean show() {//同步監督器:MyThread.class
//private synchronized boolean show() {//同步監督器就是:this 別離是myt1,myt2,myt3 此處利用是錯誤的
if (ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "票號:" + ticket);
ticket--;
return true;
}
return false;
}
}
/**
* 利用同步代碼塊處置擔當Thread類的線程平安問題
* 例子 :建立三個窗口賣票,票總數100 利用實現Runable的體例
* 申明:在擔當Thread類建立多線程的體例中,慎用this充任同步監督器,考慮利用當前類充任監督器如MyThread.class
* @author Administrator
*
*/
public class WindowsThread {
public static void main(String[] args) {
MyThread myt1 = new MyThread();
myt1.start();
MyThread myt2 = new MyThread();
myt2.start();
MyThread myt3 = new MyThread();
myt3.start();
//ConcurrentHashMap<K, V>
}
}
線程平安問題
1、利用lock鎖
2、利用synchronized關頭字,同步方式或者同步塊
0 篇文章
如果覺得我的文章對您有用,請隨意打賞。你的支持將鼓勵我繼續創作!