关于Java线程 场景是这样的,现在有一个Web应用程序安装在服务器上(WebSphere Application Server)之后,然后这个应用中启动了一个线程,在后台运行一个任务,现在我除了关闭服务器之外,请问还有什么办法能够很方便的停止这个线程?或者说如何去管理这些线程呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不熟1. 该线程没有自己结束的条件么?2. 能设置为daemon类型的么? 你可以在前台中设置一个循环,然后循环监听socket来连接,如果与了连接,就新建一个后台线程,然后让后台线程工作,你的前台线程继续循环等待socket的连接。后台线程运行完了就完了,而前台线程你可以传一个标签值给他,让他得到这个标签值(boolean)时就循环,给你看段代码:package server;import java.io.FileInputStream;import java.net.ServerSocket;import java.net.Socket;import java.util.Properties;/** * 服务器端口类 * 2009-12-8 * @Team 永不放弃小组[Never Give Up Team] * @version 1.0 * @since JDK1.6(建议) * @author WangPeihu * */public class DMSServer extends Thread{ private int port; private Socket socket ; private static ServerSocket ss; public boolean flag = true; private FileInputStream fis; /** *@开启端口 */ public void initSocket() { try { fis = new FileInputStream("db.properties"); Properties p = new Properties(); p.load(fis); port = Integer.parseInt(p.getProperty("port")); ss = new ServerSocket(port); } catch (Exception e) { e.printStackTrace(); } finally { try { fis.close(); } catch (Exception e) { System.out.println(e.getMessage()); } } } /** * @打开服务端 */ public void start() { try{ initSocket(); while (flag) { socket = ss.accept(); //阻塞于此 System.out.println("建立一个用户连接....." + socket.getInetAddress()); Thread t = new Thread(new DMSServerThread(socket)); t.start(); } }catch(Exception e){ System.out.println("服务器断连接失败......"); }finally{ shutDown(); } } /** *@关闭服务端 */ public void shutDown() { try { ss.close(); } catch (Exception e) { try { ss.close(); } catch (Exception e1) { e1.printStackTrace(); } System.out.println("服务器异常关闭"); } } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; }} 你在你启动的这个线程里面定义一个关闭线程的方法,这个方法一般是设置标志位为true或者false,在线程的run方法的循环中判断这个标志位,如果true线程继续执行否则就停止。然后你要想在别的类控制这个线程,你得到这个线程对象,在用对象调用关闭方法不就行了吗? 如果你的应用程序是WEB应用程序的话,就应该使用SERVLET的ServletContextListener接口,该接口需要实现二个方法:void contextDestroyed(ServletContextEvent event);void contextInitialized(ServletContextEvent event);在WEB应用程序启动的时候会自动调用contextInitialized方法,你可以在这个方法中启动一个线程,并且持有这个线程的实例句柄,在WEB应用程序关闭的时候会自动调用contextDestroyed方法,你应该在该方法中调用线程实例句柄的interrupt()方法。如果你的线程中存在无法interrupt的实现,例如:IO、SOCKET,则需要自己设置GUARD变量进行线程的控制。另外,该类需要在web.xml文件中进行配置:<listener> <listener-class>com.sand.core.listener.WebApplicationContextListener</listener-class> </listener> 程序编译通过,但运行错误,错误提示如下: 推荐一个Java开发的有趣的PDF、Office 文档工具 谁能给我个纯图片选择的JCombobox的源代码,收到立即给分! java实现telnet到交换机上时返回值是????,请问如何解决?(代码见内) java中的数据结构问题 请教forte for java ce 3.0在哪里有下载 如何修改对话框或框架中标题栏的字体大小(就是修改框架上蓝条中字体的大小) 初学java,代码问题想请各位指教 问一个关于java正则表达式的问题(总是少一个字母) CMP实体BEAN的问题: java显示问题求教 一个简单的小问题。
2. 能设置为daemon类型的么?
package server;import java.io.FileInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Properties;/**
* 服务器端口类
* 2009-12-8
* @Team 永不放弃小组[Never Give Up Team]
* @version 1.0
* @since JDK1.6(建议)
* @author WangPeihu
*
*/
public class DMSServer extends Thread{
private int port;
private Socket socket ;
private static ServerSocket ss;
public boolean flag = true;
private FileInputStream fis; /**
*@开启端口
*/
public void initSocket() {
try {
fis = new FileInputStream("db.properties");
Properties p = new Properties();
p.load(fis);
port = Integer.parseInt(p.getProperty("port"));
ss = new ServerSocket(port);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fis.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
} /**
* @打开服务端
*/
public void start() {
try{
initSocket();
while (flag) {
socket = ss.accept(); //阻塞于此
System.out.println("建立一个用户连接....." + socket.getInetAddress());
Thread t = new Thread(new DMSServerThread(socket));
t.start();
}
}catch(Exception e){
System.out.println("服务器断连接失败......");
}finally{
shutDown();
}
}
/**
*@关闭服务端
*/
public void shutDown() {
try {
ss.close();
} catch (Exception e) {
try {
ss.close();
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.println("服务器异常关闭");
}
} public boolean isFlag() {
return flag;
} public void setFlag(boolean flag) {
this.flag = flag;
}
}
void contextDestroyed(ServletContextEvent event);
void contextInitialized(ServletContextEvent event);
在WEB应用程序启动的时候会自动调用contextInitialized方法,你可以在这个方法中启动一个线程,并且持有这个线程的实例句柄,在WEB应用程序关闭的时候会自动调用contextDestroyed方法,你应该在该方法中调用线程实例句柄的interrupt()方法。如果你的线程中存在无法interrupt的实现,例如:IO、SOCKET,则需要自己设置GUARD变量进行线程的控制。另外,该类需要在web.xml文件中进行配置:
<listener>
<listener-class>com.sand.core.listener.WebApplicationContextListener</listener-class>
</listener>