我目前正在研究Cigarette Smoker问题的修改版本。您可以在下面找到我的座席类。我需要做什么才能有三个线程而不是一个?所以会有三个输出而不是一个输出。
public class agent extends Thread {
private table smokingtable;
public agent(table pSmokingtable)
{
smokingtable = pSmokingtable;
}
@Override
public void run()
{
while(true)
{
try {
Thread.sleep(5000);
} catch (Exception e) {}
smokingtable.setAgentElements();
// this triggers the smoker-threads to look at the table
output("The Agent puts " + smokingtable.getAgentElements() + table.");
// pause the agent while one smoker thread is running
}
}
public synchronized void wake()
{
try
{
notify();
} catch(Exception e){}
}
public synchronized void pause()
{
try
{
this.wait();
} catch (Exception e) {}
}
private void output(String pOutput)
{
System.out.println(pOutput);
}
}
我做过类似的事情但肯定是错的。
public class agent extends Thread {
private table smokingtable;
public agent(table pSmokingtable)
{
smokingtable = pSmokingtable;
}
@Override
public void run()
{
while(true)
{
try {
Thread.sleep(5000);
} catch (Exception e) {}
smokingtable.setAgent1Elements();
output("The Agent 1 puts " + smokingtable.getAgent1Elements());
smokingtable.setAgent2Elements();
output("The Agent 2 puts " + smokingtable.getAgent2Elements());
smokingtable.setAgent3Elements();
output("The Agent 3 puts " + smokingtable.getAgent3Elements());
pause();
}
}
public synchronized void wake()
{
try
{
notify();
} catch(Exception e){}
}
public synchronized void pause()
{
try
{
this.wait();
} catch (Exception e) {}
}
private void output(String pOutput)
{
System.out.println(pOutput);
}
}
答案 0 :(得分:2)
为了拥有3个线程而不是1个线程,你需要创建3个线程并启动它们。
在您的情况下,最简单的方法是:
Thread agent1 = new agent( );
Thread agent2 = new agent( );
Thread agent3 = new agent( );
agent1.start( );
agent2.start( );
agent3.start( );
agent1.join( );
agent2.join( );
agent3.join( );
更好的做事方式是使用ExecutorService框架,例如:的ThreadPoolExecutor。
ExecutorService pool = Executors.newFixedThreadPool( 3 );
for ( int i = 0; i < 3; ++i )
{
pool.execute( new agent( ) );
}
// This will wait for your agents to execute
pool.shutdown( );
答案 1 :(得分:0)
也许我完全误解了你的问题,但看起来你需要再次回顾在java中使用踏板的基础知识。 this将是一个开始的好地方
在第二个示例中,您似乎试图从同一个线程运行所有三个代理,我想这不是您打算做的。
在您提供的第一个代码提取中,将代理ID添加为字段并添加到代理的构造函数,并将此Id附加到输出消息。 现在你需要做的就是从某个地方创建三个代理实例(可能是你的主方法)并从那里调用它们的run方法。
public static void main(String[] args) {
for(int i = 0; i < 3; i++)
new agent(i).start();
}