一次多件事(线程?)

时间:2010-04-01 23:47:19

标签: java multithreading

所有

让程序同时执行多项操作的简单方法是什么,即使计算机不一定有多个“核心”。我可以通过创建多个线程来实现吗?

我的目标是能够将两台计算机联网(通过套接字)来响应彼此的请求,同时我的程序将能够管理UI。我希望服务器同时可能同时处理多个客户端。

我的理解是通过BufferedReader.readLine()和PrintWriter.println()完成了通信。我的问题是我希望服务器等待多个readLine()请求,还要做其他事情。我该如何处理?

非常感谢,

乔纳森

5 个答案:

答案 0 :(得分:1)

看一下这个页面:http://www.ashishmyles.com/tutorials/tcpchat/index.html - 它给出了一个很好的线程,UI细节等描述,并给出了一个聊天示例,它们将两者合并在一起。

另外,请考虑使用Apache MINA。它非常轻量级,不依赖于任何外部库(除了slf4j),并且很容易从套接字中获取内容而无需在循环中进行,并且它也非常无阻塞(或在需要时阻塞)成为)。所以,你有一个实现IoHandler的类,然后你用接受器或其他一些Mina连接类注册它。然后,它会通知您何时收到数据包。它以愉快的方式为您处理所有通常致命的后端内容(即,为客户端手动创建多个线程,然后管理这些内容)。

它还具有编解码器支持,您可以在其中转换发送和接收的消息。因此,假设您希望在连接的任何一端接收Java对象 - 这将为您进行转换。也许你还想拉上它们以提高效率?您也可以编写它,将其添加到对象编解码器下面的链中。

答案 1 :(得分:1)

是的,只需创建多个线程。它们将同时运行,无论处理器是否具有多个内核。 (对于单核,操作系统只是暂停在某些点执行正在运行的线程并运行另一个线程一段时间,所以实际上,多个线程似乎同时运行。)

这是一个很好的并发教程:http://java.sun.com/docs/books/tutorial/essential/concurrency/

答案 2 :(得分:1)

是的,您可以通过在Java程序中包含多个线程来实现此目的。

由于Java中的机制在执行此操作时变得相当复杂,请查看Java教程中的相应部分:

http://java.sun.com/docs/books/tutorial/essential/concurrency/

答案 3 :(得分:1)

套接字的标准Java教程是一个良好的开端。我用这个作为基础编写了你描述的确切程序。 “支持多个客户端”页面上的最后一点描述了如何实现线程。

http://java.sun.com/docs/books/tutorial/networking/sockets/clientServer.html

答案 4 :(得分:1)

我可以通过创建多个线程吗?

  

什么是一种非常简单的方式   一个程序不止一件事   一次,即使电脑没有   必须有多个'核心'。能够   我这样做是通过创建多个   线程?


如果你有1个单核,那么“官方”只能同时执行1个任务。因为你的电脑 s处理器如此之快并且每秒执行如此多的指令会造成计算机同时执行多个任务的错觉,而每个小单元只执行1个任务。您可以通过创建由操作系统安排在短时间内运行的线程,在Java中创建这种错觉。

我的建议是查看java.util.concurrent包,因为它包含许多有用的工具,可以更轻松地使用线程(在这个包不存在的时候,它很多更难)。我比如喜欢使用

ExecutorService es = Executors.newCachedThreadPool();

创建一个线程池,我可以提交任务同时运行。然后当我有我喜欢的任务时,我打电话给

es.execute(runnable);

runnable看起来像:

Runnable runnable = new Runnable() {
  public void run() {
      // code to run.
   }
};

例如,假设您运行以下代码:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package mytests;

import java.util.Date;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 *
 * @author alfred
 */
public class Main {

    /**
     * @param args the command line arguments
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        // TODO code application logic here
        final CountDownLatch latch = new CountDownLatch(2);
        final long start = System.nanoTime();
        ExecutorService es = Executors.newCachedThreadPool();
        Runnable runnable = new Runnable() {
            public void run() {
                sleep(1);
                System.out.println(new Date());
                latch.countDown();
            }
        };
        es.submit(runnable);
        es.submit(runnable);
        latch.await(); // waits only latch.countDown() has been called 2 times.
        // 1 nanoseconds is equal to 1/1000000000 of a second.
        long total = (System.nanoTime() - start) / 1000000;
        System.out.println("total time: " + total);
        es.shutdown();
    }

    public static void sleep(int i) {
        try {
            Thread.sleep(i * 1000);
        } catch (InterruptedException ie) {}
    }
}

输出看起来像

run:
Fri Apr 02 03:34:14 CEST 2010
Fri Apr 02 03:34:14 CEST 2010
total time: 1055
BUILD SUCCESSFUL (total time: 1 second)

但我跑了2个任务,每个任务都跑了至少1秒(因为睡眠时间为1秒)。如果我按顺序运行这两个任务,那么它至少需要2秒,但因为我使用了线程,所以只用了1秒钟。这是您想要的,可以使用java.util.concurrent包轻松完成。

我希望服务器同时可能同时处理多个客户端。

  

我的目标是能够拥有两个   联网的计算机(通过套接字)   回应彼此的要求,   而我的节目将在同一时间   能够管理UI。我想要   服务器可能处理更多   比一个客户同时   好。


我建议你看一下Netty框架(由MINA的创建者开发的MINA,但在我看来,Netty更好(更多开发))。:

  

Netty项目是一项努力   提供异步事件驱动   网络应用框架和   快速发展的工具   可维护的高性能&高   可扩展性协议服务器&   客户端。

它将为您完成所有繁重的工作。当我读到user guide时,我对netty感到非常惊讶。 Netty使用nio这是高度并发服务器的新方法,可以更好地扩展IO。就像我之前说的那样,这个框架为你做了所有繁重的工作

我的问题是我希望服务器等待多个readLine()请求,还要做其他事情

  

我的理解是   沟通完成   BufferedReader.readLine()和   PrintWriter.println()。我的问题是   我希望服务器等待   在多个readLine()请求和   也在做其他事情。我如何能   处理这个?

再次,当您查看netty的用户指南+示例时,您会发现它能够以有效的方式为您完成所有繁重工作。您只需指定一些简单的回调即可从客户端获取数据。


希望这已经回答了你所有的问题。否则我建议你发表评论,以便我更好地解释它。