通过run方法和Start方法执行Thread

时间:2015-05-18 11:55:11

标签: java multithreading thread-safety

我正在尝试使用thread.Run以及thread.start执行Thread进入Both方法

这里的情况 主类

Thread thread = new GetTimeZones();
ByImletingInterface thread21 = new ByImletingInterface();
thread21.getMailStarttime(5);

ByImletingInterface thread2 = new ByImletingInterface();
thread2.getMailStarttime(10);

thread.start();
new Thread(thread21).start();
new Thread(thread2).start();

线程1

public class ByImletingInterface implements Runnable {
    private int starttime;

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            Thread.sleep(starttime * 1000);
        } catch (Exception e) {
            // TODO: handle exception
            System.out.println(e);
        }
        System.out.println("Checking Mail");
    }

}

和其他therad

public class GetTimeZones extends Thread {

    @SuppressWarnings("static-access")
    @Override
    public void run() {
        // TODO Auto-generated method stub
        Locale locale;
        DateFormat timeforMatter;
        DateFormat dateforMatter;
        String timeoutput = null;
        String dateoutput = null;

        try {
            java.util.Date date;

            for (int i = 0; i < 20; i++) {
                date = new Date();
                locale = new Locale("en");

                timeforMatter = DateFormat.getTimeInstance(DateFormat.DEFAULT,
                        locale);
                dateforMatter = DateFormat.getDateInstance(DateFormat.DEFAULT,
                        locale);

                //System.out.println(timeforMatter);
                timeoutput = timeforMatter.format(date);
                dateoutput = dateforMatter.format(date);

                System.out.println(timeoutput);
                System.out.println(dateoutput);
                System.out.println();


                try {
                    Thread.sleep(2000);
                } catch (Exception e) {
                    // TODO: handle exception
                }
            }

        } catch (Exception e) {
            // TODO: handle exception
            System.out.println(e);
            e.printStackTrace();
        }

        super.run();
    }
}

如何描述我的概率这两个课程都不需要但仍然给予它。

当我像往常一样将rad.start用于主类时。它有意识地执行了三个线程。

但是当我使用那个时,一个接一个地执行。意味着它的同步。为什么会这样?

1 个答案:

答案 0 :(得分:3)

当你调用run()方法时,你在当前线程上运行它,所以它当然会逐个运行,因为只有一个线程(每个run()方法都会被执行在前一个完成之后)。

只有当您调用start()时,才会创建新线程并在该新线程中执行run()方法。