可以參考下面的代碼:
嶗山網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護(hù)。創(chuàng)新互聯(lián)從2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
public class Test{
public static void main(String args[]){
int[]a=new int[20];
for(int i=1;i=20;i++){
a[i-1]=i;
try{Thread.sleep(1000);}catch(Exception e){}
System.out.println(a[i-1]);
}
}
}//利用數(shù)組,輸出20個數(shù),每秒輸出一個。
擴展資料:
Java幾種常用的循環(huán)如下:
1、for循環(huán)(已知循環(huán)多少次)
使用方法:先判斷,在執(zhí)行;如果循環(huán)次數(shù)確定,那么一般用for循環(huán)
2、while循環(huán)
使用方法:先判斷,在執(zhí)行;當(dāng)條件表達(dá)式成立時,則執(zhí)行循環(huán)體,然后再進(jìn)行判斷,如果條件不成立時,有可能不執(zhí)行。一般用于循環(huán)次數(shù)不確定的循環(huán)
3、do..while循環(huán)
使用方法:先執(zhí)行,后判斷;一般用于循環(huán)次數(shù)不確定的循環(huán),與while循環(huán)不同的是先執(zhí)行后判斷,至少會執(zhí)行一次。
參考資料來源:百度百科-Java (計算機編程語言)
在你的代碼基礎(chǔ)上改進(jìn)了。
package com.sacswing.resource;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Test extends JFrame {
//同步變量
private static Boolean continueThread = false;
public Test() {
Container container = getContentPane();
JButton btn = new JButton("主線程繼續(xù)");
//按鈕要添加監(jiān)聽,來控制共享數(shù)據(jù)continueThread
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
continueThread = !continueThread;
}
});
container.add(btn);
}
public static void main(String[] args) {
Test frame = new Test();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(100, 100);
frame.setVisible(true);
System.out.println("1");
// 這里時要求的代碼,要求主線程在這里懸停,直到我按下“主線程繼續(xù)”按鈕,然后才輸出“2”
synchronized (continueThread) {
//如果繼續(xù)線程為false,則執(zhí)行循環(huán)
while (continueThread == false) {
}
}
System.out.println("2");
}
}
1.sleep()
使當(dāng)前線程(即調(diào)用該方法的線程)暫停執(zhí)行一段時間,讓其他線程有機會繼續(xù)執(zhí)行,但它并不釋放對象鎖。也就是如果有Synchronized同步塊,其他線程仍然不同訪問共享數(shù)據(jù)。注意該方法要捕獲異常
比如有兩個線程同時執(zhí)行(沒有Synchronized),一個線程優(yōu)先級為MAX_PRIORITY,另一個為MIN_PRIORITY,如果沒有Sleep()方法,只有高優(yōu)先級的線程執(zhí)行完成后,低優(yōu)先級的線程才能執(zhí)行;但當(dāng)高優(yōu)先級的線程sleep(5000)后,低優(yōu)先級就有機會執(zhí)行了。
總之,sleep()可以使低優(yōu)先級的線程得到執(zhí)行的機會,當(dāng)然也可以讓同優(yōu)先級、高優(yōu)先級的線程有執(zhí)行的機會。
2.join()
join()方法使調(diào)用該方法的線程在此之前執(zhí)行完畢,也就是等待調(diào)用該方法的線程執(zhí)行完畢后再往下繼續(xù)執(zhí)行。注意該方法也要捕獲異常。
3.yield()
它與sleep()類似,只是不能由用戶指定暫停多長時間,并且yield()方法只能讓同優(yōu)先級的線程有執(zhí)行的機會。
4.wait()和notify()、notifyAll()
這三個方法用于協(xié)調(diào)多個線程對共享數(shù)據(jù)的存取,所以必須在Synchronized語句塊內(nèi)使用這三個方法。前面說過Synchronized這個關(guān)鍵字用于保護(hù)共享數(shù)據(jù),阻止其他線程對共享數(shù)據(jù)的存取。但是這樣程序的流程就很不靈活了,如何才能在當(dāng)前線程還沒退出Synchronized數(shù)據(jù)塊時讓其他線程也有機會訪問共享數(shù)據(jù)呢?此時就用這三個方法來靈活控制。
wait()方法使當(dāng)前線程暫停執(zhí)行并釋放對象鎖標(biāo)志,讓其他線程可以進(jìn)入Synchronized數(shù)據(jù)塊,當(dāng)前線程被放入對象等待池中。當(dāng)調(diào)用 notify()方法后,將從對象的等待池中移走一個任意的線程并放到鎖標(biāo)志等待池中,只有
鎖標(biāo)志等待池中的線程能夠獲取鎖標(biāo)志;如果鎖標(biāo)志等待池中沒有線程,則notify()不起作用。
notifyAll()則從對象等待池中移走所有等待那個對象的線程并放到鎖標(biāo)志等待池中。
注意 這三個方法都是java.lang.Ojbect的方法!
------------
再添兩天比較熟悉的:
2.run()和start()
這兩個方法應(yīng)該都比較熟悉,把需要并行處理的代碼放在run()方法中,start()方法啟動線程將自動調(diào)用 run()方法,這是由Java的內(nèi)存機制規(guī)定的。并且run()方法必須是public訪問權(quán)限,返回值類型為void。
2.關(guān)鍵字Synchronized
這個關(guān)鍵字用于保護(hù)共享數(shù)據(jù),當(dāng)然前提是要分清哪些數(shù)據(jù)是共享數(shù)據(jù)。每個對象都有一個鎖標(biāo)志,當(dāng)一個線程訪問該對象時,被Synchronized修飾的數(shù)據(jù)將被“上鎖”,阻止其他線程訪問。當(dāng)前線程訪問完這部分?jǐn)?shù)據(jù)后釋放鎖標(biāo)志,其他線程就可以訪問了。
public ThreadTest implements Runnable
{
public synchronized void run(){
for(int i=0;i10;i++)
{
System.out.println(" " + i);
}
}
public static void main(String[] args)
{
Runnable r1 = new ThreadTest();
Runnable r2 = new ThreadTest();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
}
以上這段程序中的 i 變量并不是共享數(shù)據(jù),也就是這里的Synchronized關(guān)鍵字并未起作用。因為t1,t2兩個線程是兩個對象(r1,r2)的線程。不同的對象其數(shù)據(jù)是不同的,所以r1和r2兩個對象的i變量是并不是共享數(shù)據(jù)。
當(dāng)把代碼改成如下:Synchronized關(guān)鍵字才會起作用
Runnable r = new ThreadTest();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
t2.start();
---------------
JAVA線程的四種狀態(tài)
線程有四種狀態(tài),任何一個線程肯定處于這四種狀態(tài)中的一種:
1) 產(chǎn)生(New):線程對象已經(jīng)產(chǎn)生,但尚未被啟動,所以無法執(zhí)行。如通過new產(chǎn)生了一個線程對象后沒對它調(diào)用start()函數(shù)之前。
2) 可執(zhí)行(Runnable):每個支持多線程的系統(tǒng)都有一個排程器,排程器會從線程池中選擇一個線程并啟動它。當(dāng)一個線程處于可執(zhí)行狀態(tài)時,表示它可能正處于線程池中等待排排程器啟動它;也可能它已正在執(zhí)行。如執(zhí)行了一個線程對象的start()方法后,線程就處于可執(zhí)行狀態(tài),但顯而易見的是此時線程不一定正在執(zhí)行中。
3) 死亡(Dead):當(dāng)一個線程正常結(jié)束,它便處于死亡狀態(tài)。如一個線程的run()函數(shù)執(zhí)行完畢后線程就進(jìn)入死亡狀態(tài)。
4) 停滯(Blocked):當(dāng)一個線程處于停滯狀態(tài)時,系統(tǒng)排程器就會忽略它,不對它進(jìn)行排程。當(dāng)處于停滯狀態(tài)的線程重新回到可執(zhí)行狀態(tài)時,它有可能重新執(zhí)行。如通過對一個線程調(diào)用wait()函數(shù)后,線程就進(jìn)入停滯狀態(tài),只有當(dāng)兩次對該線程調(diào)用notify或notifyAll后它才能兩次回到可執(zhí)行狀態(tài)。
一、線程5種狀態(tài)
新建狀態(tài)(New) 新創(chuàng)建了一個線程對象。
就緒狀態(tài)(Runnable) 線程對象創(chuàng)建后,其他線程調(diào)用了該對象的start()方法。該狀態(tài)的線程位于可運行線程池中,變得可運行,等待獲取CPU的使用權(quán)。
運行狀態(tài)(Running) 就緒狀態(tài)的線程獲取了CPU,執(zhí)行程序代碼。
阻塞狀態(tài)(Blocked) 阻塞狀態(tài)是線程因為某種原因放棄CPU使用權(quán),暫時停止運行。直到線程進(jìn)入就緒狀態(tài),才有機會轉(zhuǎn)到運行狀態(tài)。阻塞的情況分三種:
等待阻塞:運行的線程執(zhí)行wait()方法,JVM會把該線程放入等待池中。
同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則JVM會把該線程放入鎖池中。
其他阻塞:運行的線程執(zhí)行sleep()或join()方法,或者發(fā)出了I/O請求時,JVM會把該線程置為阻塞狀態(tài)。當(dāng)sleep()狀態(tài)超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉(zhuǎn)入就緒狀態(tài)。
死亡狀態(tài)(Dead):線程執(zhí)行完了或者因異常退出了run()方法,該線程結(jié)束生命周期。
二、Jstack中常見的線程狀態(tài)
應(yīng)用程序啟動后,我們對系統(tǒng)運行狀況的觀測大部分情況下是通過運行日志。但是若某一天發(fā)現(xiàn),日志中記錄的行為與預(yù)想的不一致,此時需要進(jìn)一步的系統(tǒng)監(jiān)控該怎么辦,Jstack是常用的排查工具,它能輸出在某一個時間,Java進(jìn)程中所有線程的狀態(tài),很多時候這些狀態(tài)信息能給我們的排查工作帶來有用的線索。?
Jstack的輸出中,Java線程狀態(tài)主要是以下幾種:
RUNNABLE?線程運行中或I/O等待
BLOCKED?線程在等待monitor鎖(synchronized關(guān)鍵字)
TIMED_WAITING?線程在等待喚醒,但設(shè)置了時限
WAITING?線程在無限等待喚醒
1) 讓線程一直處于RUNNABLE
public?static?void?runnable()?{
long?i?=?0;
while?(true)?{
i++;
}
}
2) 讓線程一直處于BLOCKED
public?static?void?blocked()?{
final?Object?lock?=?new?Object();
new?Thread()?{
public?void?run()?{
synchronized?(lock)?{
System.out.println("i?got?lock,?but?don't?release");
try?{
Thread.sleep(1000L?*?1000);
}?catch?(InterruptedException?e)?{
}
}
}
}.start();
try?{?Thread.sleep(100);?}?catch?(InterruptedException?e)?{}
synchronized?(lock)?{
try?{
Thread.sleep(30?*?1000);
}?catch?(InterruptedException?e)?{
}
}
}
主線程sleep,先讓另外一個線程拿到lock,并長期持有l(wèi)ock(sleep會持有鎖,wait不會)。此時主線程會BLOCK住等待lock被釋放,此時jstack的輸出可以看到main線程狀態(tài)是BLOCKED。這里要注意的是只有synchronized這種方式的鎖(monitor鎖)才會讓線程出現(xiàn)BLOCKED狀態(tài),等待ReentrantLock則不會。
3)?讓線程處于TIMED_WAITING狀態(tài)
public?static?void?timedWaiting()?{
final?Object?lock?=?new?Object();
synchronized?(lock)?{
try?{
lock.wait(30?*?1000);
}?catch?(InterruptedException?e)?{
}
}
}
4)讓線程處于WAITING狀態(tài)
public?static?void?waiting()?{
final?Object?lock?=?new?Object();
synchronized?(lock)?{
try?{
lock.wait();
}?catch?(InterruptedException?e)?{
}
}
}
無超時的等待,必須等待lock.notify()或lock.notifyAll()或接收到interrupt信號才能退出等待狀態(tài)。
要使用線程 wait 和喚醒
while(條件)
wait();
while(條件)
//喚醒線程wait(),執(zhí)行wait前的動作
notifyAll();
名稱欄目:java進(jìn)程等待代碼 Java 進(jìn)程
標(biāo)題URL:http://chinadenli.net/article10/dodipgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、品牌網(wǎng)站設(shè)計、做網(wǎng)站、商城網(wǎng)站、營銷型網(wǎng)站建設(shè)、網(wǎng)站營銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)