Ⅰ java怎樣結束帶ServerSocket監聽的線程
ss.accept()阻塞了,無法結束該線程 。既不能被打斷,也不能強制結束。你應該想別的辦法,而不應該嘗試結束這個線程。
Ⅱ JAVA多線程程序設計,有追加100分
package com;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ColorThread
{
public static void main(String[] args)
{
Myframe mf =new Myframe();//實例化對象
Thread t=new Thread(mf);//加入線程
t.start();//啟動線程
}
}
class Myframe extends JFrame implements Runnable,ActionListener
{
private static final long serialVersionUID = 1L;
Random rand = new Random(System.currentTimeMillis());//隨機數.用當前系統時間做基數
JPanel panel = new JPanel();//變色的面板
final JButton button = new JButton("點擊停止或啟動");//按鈕
int action=0;//變色或停止變色 判斷標示
public Myframe()
{
super("1/10秒變色1次");
button.setBounds(10, 10, 200, 30); //設置按鈕坐標
button.addActionListener(this); //設置按鈕監聽
panel.setBounds(10, 50, 100, 100); //面板坐標
panel.setBackground(Color.BLUE); //面板初始顏色
this.setBounds(100, 100, 300, 300); //frame 初始大小坐標
this.add(panel); //將面板加入frame
this.setLayout(null); //設置frame布局為null
this.add(button); //將按鈕加入frame
this.setDefaultCloseOperation(3); //設置關閉frame就退出程序
this.setVisible(true); //設置frame顯示為可見
}
/**
* 實現Runnable線程介面
*/
public void run()
{
while (true)//設置死循環
{
try
{
if(action==0)//判斷操作為0時改變面板背景顏色
{
panel.setBackground(getcolor()); //變色
}
Thread.sleep(100);//10之一秒 的休眠
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
private Color getcolor() //獲得顏色
{
return new Color(getNum(), getNum(), getNum());
}
private int getNum() //獲得小於255的隨機數字
{
return rand.nextInt(255);
}
public void actionPerformed(ActionEvent e)//監聽事件
{
if(action==0) //點擊後判斷.修改值.
{
action =1;
}else
{
action =0;
}
}
}
//有注釋了
Ⅲ java多線程的好處
多線程可以把任務分塊執行,分塊後可以同時進行而不用等待。 這樣效率更高
如下載文件,通過多線程就可以實現多文件下載
Ⅳ java中的事件監聽是怎樣實現隨時監聽的,是通過線程嗎
java中的事件監聽不是通過線程實現的,它是通過一種注冊--通知機制實現的。在專java的設計模式中,有一種模屬式叫:觀察者模式,和這個類似。
Ⅳ java DatagramSocket receive 方法 接收 多個包
多線程,用一個線程監聽,如果接到包,創建一個線程處理,繼續監聽。保證一直有一個線程在監聽就可以了。
Ⅵ java自定義事件,線程a如何每一秒鍾觸發一個事件,然後另一個線程b監聽之,並作出反應
思路,在線程b的操作中調用a.wait(),線程a中觸發的事件後面添加notify(),則在b執行到a.wait()的時候,回b等待a,a執行到notify(),通知a的等答待列表中的b線程進入鎖池,此時b有機會繼續執行,這樣就打到了線程b監聽a執行完事件
Ⅶ java中如何監聽一個線程的結束
你可以把抄thread的執行的代碼 全部TRY CATCH起來啊 如果報異常了 就發送請求給SERVLET啊 如果正常結束完成 你也可以坐響應的處理啊 。
Runtime.getRuntime().addShutdownHook(Thread);當程序出現問題時會先啟動Thread這個線程,
幫你解決記錄或或者其他線程的關閉。
Ⅷ java 澶氱嚎紼嬬洃鍚鏁版嵁琛ㄧ殑鏀瑰彉錛屾庝箞瑙e喅鍚屾ラ棶棰
鍣錛屾槸榪欐牱鐨勶紝涓嶆槸浠涔堜笢瑗塊兘鑳藉綋鍋氶攣錛屼綘涓嶈兘榪欐牱鐞嗚В銆
synchronized(obj)錛宱bj榪欓噷鏄浣犳墍鍦ㄧ被鐨凪IDlet鐨勪竴涓瀹炰緥瀵硅薄銆
鐩鐨勬槸瑙e喅鍥犵嚎紼嬩笉鍚屾ヨ屽規暟鎹閫犳垚鐮村潖鐨勯棶棰樸
鍋囧傦細鍦ㄤ竴涓綾諱腑鏈変竴涓鎴愬憳鍙橀噺a,榪樻湁涓や釜綰跨▼錛屽傛灉綰跨▼涓嶅悓姝ョ殑璇濓紝榪欎袱涓綰跨▼鏈夊彲鑳藉悓鏃惰塊棶鍚屼竴涓鍙橀噺a,榪欐牱鐨勮瘽錛屽氨浼氬嚭鐜伴棶棰橈紝鏈鍚庢墽鐨勭粨鏋渁鍒板簳鏄鍑犲憿錛屾墍浠ュ氨瑕佷嬌鐢ㄧ嚎紼嬪悓姝ヨ繖涓鍔炴硶浜嗐
浣跨敤綰跨▼鍚屾ュ悗錛岀嚎紼1鍦ㄨ塊棶a鐨勬椂鍊欙紝鎴戝姞浜嗕竴鎶婇攣錛屽湪榪欎釜鏃跺欏埆鐨勭嚎紼嬫槸涓嶅厑璁歌塊棶a鐨勶紝絳夌嚎紼1瀵筧鏈夎塊棶緇撴潫鍚庯紝灝變細鍘繪帀榪欐妸閿侊紝鍏朵粬鐨勭嚎紼嬪啀璁塊棶a鐨勬椂鍊欙紝鍙堜細鍔犻攣錛岃繖鏍峰湪鍚屼竴鏃跺欙紝鍙鑳芥湁涓鏂硅塊棶a,榪欐牱灝變笉浼氬嚭鐜伴棶棰橈紝鎴戣磋繖涔堝氾紝浣犳槑鐧戒簡鍚楋紵甯屾湜浣犺兘鏄庣櫧錛屼笉鐒舵垜璇寸殑綆楃櫧璇翠簡錛屽懙鍛碉紒錛侊紒錛
Ⅸ 如何正確結束Java線程
1. 使用退出標志,使線程正常退出,也就是當run方法完成後線程終止。
2. 使用stop方法強行終止線程(這個方法不推薦使用,因為stop和suspend、resume一樣,也可能發生不可預料的結果)。
3. 使用interrupt方法中斷線程。
1. 使用退出標志終止線程
當run方法執行完後,線程就會退出。但有時run方法是永遠不會結束的。如在服務端程序中使用線程進行監聽客戶端請求,或是其他的需要循環處理的任務。在這種情況下,一般是將這些任務放在一個循環中,如while循環。如果想讓循環永遠運行下去,可以使用while(true){……}來處理。但要想使while循環在某一特定條件下退出,最直接的方法就是設一個boolean類型的標志,並通過設置這個標志為true或false來控制while循環是否退出。下面給出了一個利用退出標志終止線程的例子。
package chapter2;
public class ThreadFlag extends Thread
{
public volatile boolean exit = false;
public void run()
{
while (!exit);
}
public static void main(String[] args) throws Exception
{
ThreadFlag thread = new ThreadFlag();
thread.start();
sleep(5000); // 主線程延遲5秒
thread.exit = true; // 終止線程thread
thread.join();
System.out.println("線程退出!");
}
}
在上面代碼中定義了一個退出標志exit,當exit為true時,while循環退出,exit的默認值為false.在定義exit時,使用了一個Java關鍵字volatile,這個關鍵字的目的是使exit同步,也就是說在同一時刻只能由一個線程來修改exit的值,
2. 使用stop方法終止線程
使用stop方法可以強行終止正在運行或掛起的線程。我們可以使用如下的代碼來終止線程:
thread.stop();
雖然使用上面的代碼可以終止線程,但使用stop方法是很危險的,就象突然關閉計算機電源,而不是按正常程序關機一樣,可能會產生不可預料的結果,因此,並不推薦使用stop方法來終止線程。
3. 使用interrupt方法終止線程
使用interrupt方法來終端線程可分為兩種情況:
(1)線程處於阻塞狀態,如使用了sleep方法。
(2)使用while(!isInterrupted()){……}來判斷線程是否被中斷。
在第一種情況下使用interrupt方法,sleep方法將拋出一個InterruptedException例外,而在第二種情況下線程將直接退出。下面的代碼演示了在第一種情況下使用interrupt方法。
package chapter2;
public class ThreadInterrupt extends Thread
{
public void run()
{
try
{
sleep(50000); // 延遲50秒
}
catch (InterruptedException e)
{
System.out.println(e.getMessage());
}
}
public static void main(String[] args) throws Exception
{
Thread thread = new ThreadInterrupt();
thread.start();
System.out.println("在50秒之內按任意鍵中斷線程!");
System.in.read();
thread.interrupt();
thread.join();
System.out.println("線程已經退出!");
}
}
上面代碼的運行結果如下:
在50秒之內按任意鍵中斷線程!
sleep interrupted
線程已經退出!
在調用interrupt方法後, sleep方法拋出異常,然後輸出錯誤信息:sleep interrupted.
注意:在Thread類中有兩個方法可以判斷線程是否通過interrupt方法被終止。一個是靜態的方法interrupted(),一個是非靜態的方法isInterrupted(),這兩個方法的區別是interrupted用來判斷當前線是否被中斷,而isInterrupted可以用來判斷其他線程是否被中斷。因此,while (!isInterrupted())也可以換成while (!Thread.interrupted())。