我目前正在熟悉Java中的线程和多线程。我正在进行一个简单的练习,必须将数组根据我在运行时传递给功能的n个线程数的n次数将数组划分为平等分区。
但是,我很想知道我是在每个线程中实际上执行Mergesort(),还是只是作为一个线程运行。我做了一个for loop,它类似于thread.start(),然后是一个try-catch块,其中thread.join()将被调用,然后我使用thread.currentthread()打印名称。但是,在整个执行中,我都会得到"主"一词。
这是否意味着我不是真正的多线程?我的想法是我会得到类似thread-0的东西...但是只有当我做thread.getName();
时,我才能得到它。请建议。
for (MedianMultiThread mmt : threadList) {
mmt.start();
try {
mmt.join();
sortedSubArrays.add(mmt.getInternal());
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
}
编辑:意识到我在线程中运行了CurrentThread(),但是当我在Run()方法中运行它时,我得到了不同的结果。谢谢大家!
名称thread.currentThread()
方法使很多人感到困惑。 thread.currentThread()
dis 不是返回"当前线程",除非您碰巧认为"当前线程"是指调用函数的线程。
这就是thread.currentThread()
实际上所做的:它返回对称呼它的线程的引用。如果它总是在程序中返回"主要",则意味着您的程序只从main()线程调用它。
这个名字来自很久以前,当时大多数计算机只有一个CPU,这应该对正在编写线程调度代码的人意味着什么。如果您正在为单台CPU机器编写调度程序,则在任何给定时间都不会有一个以上的线程。称其为"当前线程"是很自然的。
返回在单个CPU系统上运行的老式 - unix风格的操作系统中当前线程的身份的系统调用只能返回称其为线程的身份。
原来在用户空间程序中非常有用。
"当前线程"的想法在现代多处理器系统上并不重要,但是返回调用线程身份的系统调用仍然像以往一样有用。
不幸的是,我们被旧名称所困。
p.s。,这从来没有任何意义:
mmt.start();
try {
mmt.join();
...
} catch (...) {
...
}
除非他们都可以同时做一些有用的事情,否则永远没有任何理由拥有两个(或更多)线程。在您的代码示例中,一个线程启动第二个线程,然后第一个线程除了等待第二个线程完成外,没有。
您也可以在第一个线程中完成所有工作。
尝试以下:
您需要实际启动所有线程,然后加入它们 ash all 返回,
// start all of them
for (MedianMultiThread mmt : threadList) {
mmt.start();
}
// join all back to main thread
try {
mmt.join();
sortedSubArrays.add(mmt.getInternal());
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
// ... inside your worker thread's run() method
public void run(){
System.out.println("Thread: "+Thread.currentThread());
// do actual work...
}
您必须检查代码,是否从实际执行工作工作线程(而不是从主线程)调用函数Thread.currentThread()
。这意味着,您需要将Thread.currentThread()
输出放入分类器线程的run()
方法中。
第二个建议是线程正在随机运行。我认为这不是问题,但是您需要牢记这一点。
它始终打印" main",这意味着打印线程名称的代码总是由主线程执行,因此该件不是多线程。如果您显示了确切的代码,那会更好。