Java顺序但同时运行

时间:2014-06-05 10:38:21

标签: java multithreading sockets tcp

这可能看起来很愚蠢但可能是顺序运行还是同时使用Threads?例如,请参阅以下代码:

public void processMessage(Socket socket) {
     char[] data = buildData(socket.getInputStream());
     int primaryKey = saveRecord(data);
     // do something else
}

public char[] buildData(InputStream inputStream) {
    return new char[5];
}

public int saveRecord(char[] data) {
   // save to database and return primary key
}

Runnable runnable = new Runnable() {
   public void run() {
        processMessage(socket.getInputStream());
   }
};
new Thread(runnable).start();

Runnable runnable2 = new Runnable() {
   public void run() {
       processMessage(socket.getInputStream());
   }
};
new Thread(runnable2).start();

我要做的是启动一个线程并执行完整的方法集,然后另一个线程启动并完全完成。这是因为我收到一些数据,读取数据,插入数据库,我有其他的东西,但希望避免数据库更新并发问题。

实际上,这是一个TCP应用程序,其中数据来自套接字,数据不会立即到达。在我有一个单线程应用程序之前,但由于应用程序运行速度太慢而且来自套接字的数据没有在一个之前到达,我引入了Threads。现在TCP套接字上有完整的数据集,但我想避免数据库并发问题。

以上只是示例代码。

我理解Threads的基础知识,我知道每个Thread都有自己的堆栈,但我想保持数据库插入/更新正确,以避免任何数据冲突。

编辑:

private ServerSocket serverSocket;
private Socket socket;

public void acceptData() {
      serverSocket = new ServerSocket("somePort");
      socket = serverSocket.accept();
      Runnable runnable = new Runnable() {
          public void run() {
              processMessage(socket.getInputStream());
          }
      };
      new Thread(runnable).start(); 
}

这就是我在做的事情。在每个循环中,我创建一个新线程,以便在同时管理线程时不阻塞套接字并继续发送数据。

1 个答案:

答案 0 :(得分:0)

它看起来是一个典型的生产者/消费者模式,对吗?

将两个线程与单个信号量同步似乎是可行的。

private Object semaphore = new Object();

public void processMessage(Socket socket) {
    synchronize(semaphore) {
        char[] data = buildData(socket.getInputStream());
        int primaryKey = saveRecord(data);
        // do something else
    }
}

public char[] buildData(InputStream inputStream) {
    return new char[5];
}

public int saveRecord(char[] data) {
    // save to database and return primary key
}

Runnable runnable = new Runnable() {
    public void run() {
        processMessage(socket.getInputStream());
    }
};
new Thread(runnable).start();

Runnable runnable2 = new Runnable() {
    public void run() {
        processMessage(socket.getInputStream());
    }
};
new Thread(runnable2).start();

通过这个实现,接收消息的第一个线程将启动processMessage执行,我们将停止执行另一个线程直到它完成。

这是你在找什么?