Java中的多线程实现

时间:2016-01-04 22:31:26

标签: java multithreading

我目前正在开发一个我必须使用Thread的项目。我第一次使用。所以我的代码有很多问题。

首先,我试图测试我的Thread块是否在同一时间工作。

这是我的测试应用程序。

public class sad extends Thread
{
private String name;

private Thread t1 = new Thread()
{
    @Override
    public void run()
    {
        while ( true )
        {
            System.out.println( "I am thread 1 and working properly" );
        }
    }
};
private Thread t2 = new Thread()
{
    @Override
    public void run()
    {
        while ( true )
        {
            System.out.println( "I am thread 2 and working properly" );
        }
    }
};

public void starter()
{
    t1.start();
    t2.start();
}
}

按钮部分:

btnNewButton.addActionListener(new ActionListener() 
    {
        public void actionPerformed(ActionEvent arg0) 
        {
            sadObj.starter();
        }
    });

当我运行这个程序时:

I am thread 1 and working properly
I am thread 1 and working properly
I am thread 1 and working properly
I am thread 1 and working properly
I am thread 1 and working properly
I am thread 1 and working properly
I am thread 1 and working properly
I am thread 1 and working properly
I am thread 1 and working properly
I am thread 1 and working properly
I am thread 1 and working properly
I am thread 1 and working properly
I am thread 1 and working properly
I am thread 1 and working properly
I am thread 2 and working properly
I am thread 2 and working properly
I am thread 2 and working properly
I am thread 2 and working properly
I am thread 2 and working properly
I am thread 2 and working properly
I am thread 2 and working properly
I am thread 2 and working properly
I am thread 2 and working properly
I am thread 2 and working properly
I am thread 2 and working properly
I am thread 2 and working properly
I am thread 2 and working properly
I am thread 2 and working properly
I am thread 2 and working properly
I am thread 2 and working properly

这是输出的限制版本。通常有很多输出,所有输出都是分开的。我的意思是他们必须工作,他们必须打印混合。在我的例子中,他们一个接一个地行事。

在我的项目中,我必须同时做两个完全不同的任务。为了实现这一点,我更喜欢使用2个线程对象。但我认为他们没有完全相同的时间或其中一个等待某些原因。两者都必须连续运行。我的实施是错误的,或者怎么做?

当我在java中搜索Thread时,我已经看到如果计算机CPU有超过1个核心,那么多线程将非常有效。我的CPU是i7-3740M。我认为它至少有4个核心。那么问题是什么?

谢谢    最诚挚的问候

1 个答案:

答案 0 :(得分:0)

一般来说,核心通过在单个任务之间快速切换来模拟一次做几件事。

您的系统似乎正在优化工作,选择不做多少切换,允许一个任务运行很多,另一个任务运行很多。这样它不会经常切换(这是一件昂贵的事情)而且你得到一个线程的“运行”,然后是另一个线程的“运行”。

您可以向系统提供“提示”,您可以在特定点向另一个线程提供该提示。它可能为CPU提供更多切换线程的借口。

private Thread t1 = new Thread()
{
    @Override
    public void run()
    {
        while ( true )
        {
            System.out.println( "I am thread 1 and working properly" );
            this.yield();
        }
    }
};
private Thread t2 = new Thread()
{
    @Override
    public void run()
    {
        while ( true )
        {
            System.out.println( "I am thread 2 and working properly" );
            this.yield();
        }
    }
};

但是在一天结束时,线程调度是你无法完全控制的。

PS。您的sad类不需要扩展Thread,除非它具有自己的run()方法并且已启动。在你的例子中它没有。