我刚刚用多线程弄湿了它真的很棒。我发现自己试图找出新的方法,我可以使用它让事情变得更好,我想我找到了一个,但我不确定如何为此设计程序。
这是情况。我有一个队列服务器,多个客户端使用并生成数据,但启动我运行java程序的进程,为它们启动一些初始数据。然后我的程序完成了,我在队列服务器上有多余的容量,但没有真正运行它。所以我想尝试做一些维护任务,运行服务,做低优先级的东西。我不知道怎么做。如何设计一个同时执行完全不同任务的程序?
通常我只是将我的程序包装在while (true)
循环中并执行单个任务,并且我意识到我不能在同一个进程中同时执行两个循环(可能是嵌套的?)。为了展示一个简化的例子,我放了一堆运行runnable的代码(可能它会处理一个低优先级队列)和一个监视套接字并回复的服务(我可能想根据cpu使用情况添加更多)。我如何让他们一起工作?有没有更好的方法来设计它(我知道长期它可能更好地运行多个java进程,但现在我只是想管理一个文件,我怀疑有一种方法可以给套接字服务一个比处理文件中的队列,但如果它们都在不同的文件中运行,我不知道如何降低一个而不是另一个而不是为资源而战?)
谢谢,我会编辑这个问题,如果事实证明我说这完全错了。 但简而言之,我希望它为其他系统(示例中的服务器套接字)提供服务,当它空闲时我希望它执行其他一些任务。
示例(如果您理解我要求此代码可能没有必要阅读):
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class multipleThreads {
private ServerSocket server;
private int port = 7777;
public void ServerSocketExample() {
try {
server = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("starting");
ServerSocketExample example = new ServerSocketExample();
example.handleConnection();
while (true) {
//monitor low low priority queue
}
}
public void handleConnection() {
System.out.println("Waiting for client message...");
//
// The server do a loop here to accept all connection initiated by the
// client application.
//
while (true) {
try {
Socket socket = server.accept();
new ConnectionHandler(socket);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class ConnectionHandler implements Runnable {
private Socket socket;
public ConnectionHandler(Socket socket) {
this.socket = socket;
Thread t = new Thread(this);
t.start();
}
public void run() {
try
{
//
// Read a message sent by client application
//
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
String message = (String) ois.readObject();
System.out.println("Message Received: " + message);
//
// Send a response information to the client application
//
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject("Hi...");
ois.close();
oos.close();
socket.close();
System.out.println("Waiting for client message...");
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class MonitorQueue implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
//do work when stuff comes in the queue
}
}
答案 0 :(得分:3)
我强烈建议你看看这个项目:Java Concurrent Animated。我发现这可能是了解Java中并发概念的最好方法:它是动画的,交互式的,你可以一次只采用一个概念并获得良好的理解。
答案 1 :(得分:2)
查看java.util.concurrent包。完全可以完成你所描述的各种事情。
特别是,请查看Executors工厂类,它允许您构建Thread Pools
,允许在您指定的任意数量的Threads
上安排并同时运行多个任务。
Oracle有一些关于使用Executors
的很好的教程:
http://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html
http://docs.oracle.com/javase/tutorial/essential/concurrency/exinter.html
答案 2 :(得分:0)
并发很难,你可以在实践中阅读Java Concurrency,但即使是专家也有困难。 寻找您所在地区的培训课程。 我想推荐基于Java Concurrency in Practice并由作者Brian Goetz认可的Concurrency Specialist Courses