Java多线程-最佳实践 - java

我在理解老师的多线程方法时遇到了麻烦。好了,在展示我们的两个示例之前,我必须说他正在教很多新手(包括我在内,我想是^。^),所以他可能选择了一种易于理解的多线程方法。另外,我没有去看他的课,但是我有他的剧本,内容如下:

他正在像这样进行多线程处理:

class MyThread implements Runnable {

Thread t;

MyThread() {

    t = new Thread(this, "Demo");
    t.start();
}

public void run() {

    try {

        for (int i = 5; i > 0; i--) {

            System.out.println("Child-Thread:" + i);
            Thread.sleep(1000);
        }
    } catch (InterruptedException e) {
        System.out.println("Child interrupted");
    }
    System.out.println("Child finished");
}

}

我发现这样做更干净:

public class Aufg1 {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub

    MyThread t1 = new MyThread(1);

    ScheduledExecutorService executor = Executors.newScheduledThreadPool(5);
    executor.schedule(t1, 1, TimeUnit.SECONDS);
}

static class MyThread implements Runnable {

    int number;

    public MyThread(int number) {
        this.number = number;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        for (int i = 5; i > 0; i--) {
            System.out.println("Thread " + number + ": " + i);
        }
    }


}
}

不用理会为什么我使用5号线程池。我需要它进行其他练习。另外,在此示例中,我本可以使用ThreadPool进行一次执行。

有很大的不同吗?有没有更清洁的方法?我知道还有其他一些方法可以用于多线程,尽管我在这里只展示了一种。

谢谢!

参考方案

线程有很多实现,它们是最简单的线程本身,是可运行的基本实现。我想他的意思只是为了了解线程是什么。在您的职业生涯中,您将需要线程作为工具,并且需要了解其内部工作原理,然后使用适合您的最佳实现。

执行程序和线程都会创建一个或多个(对于执行程序而言),通常使用执行程序来代替显式创建线程。 *

无论如何,作为个人建议,我建议您继续关注使用线程的新方法,因为每种实现对解决不同的问题都会更好。

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…