2012-03-10 56 views
1

我有一个Java线程,我开始,所以它一直监听套接字(考虑到套接字读取阻塞线程是需要的)。Java线程来管理套接字并运行类方法

线程从套接字接收到数据后,需要调用一个类的方法。

现在我有两个选择这样做:

声明传递给线程,并在类中实现的接口。当线程调用接口方法时,实现类将运行它。

或者我可以将类实例作为参数传递给线程,然后调用类方法。

但我想知道该方法正在运行时线程是否阻塞。

我想是这样,但我不确定。

我希望线程具有Socket事件行为。我的意思是只负责读取主类中的socket和fire函数中的数据,即称为线程的数据。

回答

2

是的,线程在执行方法时会阻塞,所以它不能同时从套接字读取。没有信息会丢失,传输只需要更长时间,如果计算时间过长,您可能会收到套接字超时。

如果你的方法需要很长时间才能运行,你应该在另一个工作线程中执行它。我建议为此使用Executor

0

,但我想知道,如果线程块的方法是运行

是它块,而。
如果里面run你打电话来处理事情,如果这是一个接口等,你问只在乎什么做的方法也不要紧的方法实际上做

你的情况,你只有1选项。
确保您尽快将控件返回到套接字侦听线程。
这可以通过设计/强制处理类来处理不同线程中的处理来实现。
其实你的问题不是新鲜事。在基于事件的设计中,需要尽可能快地处理事件,以便不阻塞基于事件队列的流程。
这就是我会建议你设计的周围。不使用任何接口与监听线程交互,但注册一个事件监听器。

当一个事件发生时,即您的监听线程读取数据时,它会将数据作为事件传递给您的监听器,当然这个监听器会阻塞它。
那么你应该开始一个新的线程做加工和监听线程可以继续开展工作

2

你有多种选择:

  • 让你的类子类Thread的(更简单的代码,但你将合并函数部分 - 您的主代码 - 与技术方面(扩展线程))
  • 让您的类实现Runnable接口并使用该Runnable启动一个新线程(我经常这样做)。所以你的主代码仍然保留在一个被覆盖的运行方法中,但继承树取决于你(你的主类可以扩展你的其他类中的一个)
  • 保持主代码/线程与两个类分离主要代码,一个用于线程),根据需要链接两个线程(请记住,如果在另一个类中创建内部线程,则内部线程可以使用任何最终属性)。

正如其他答案中所述,run()方法中发生的任何事情当然都会阻止执行。

作为一个旁注,如果你打算处理线程和套接字,我强烈建议你看一下NIO框架,如Netty,这些行为就是这样的:通过事件驱动的客户端/服务器应用程序NewIO插座。

至于另一个题外话,我经常使用这种模式:

  • 开始采集线程,将捕获的事件;
  • 将它们推入linkedblockingqueue(queue.offer());
  • 有另一个线程共享相同的linkedblockingqueue(使用queue.take()):此操作为阻塞,只要队列为空,线程将被阻塞;

这是一个非常简单的方法,使一个线程作为“生产者”,一个线程作为“消费者”。您甚至可以让不同的消费者在同一队列中等待。

+0

+1用于引用NIO – 2012-03-10 16:02:09