Java中的多个线程

时间:2011-12-13 18:49:24

标签: java multithreading

我目前正在研究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);
    }
}

2 个答案:

答案 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();
}

查看此simple example