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