Java-使线程并发
如何使线程并发执行?我有下面的代码。过程T.Create(mt);在c.Consume(mt)开始之前完成其整个任务。我在T.Create(mt)中放置了一个sleep函数;函数,但c.Consume(mt)在完全完成之前仍不会启动。我试图通过创建进程将对象添加到堆中,并通过使用进程将它们从堆中移除,这样它们就可以撤销彼此的工作Java-使线程并发,java,multithreading,Java,Multithreading,如何使线程并发执行?我有下面的代码。过程T.Create(mt);在c.Consume(mt)开始之前完成其整个任务。我在T.Create(mt)中放置了一个sleep函数;函数,但c.Consume(mt)在完全完成之前仍不会启动。我试图通过创建进程将对象添加到堆中,并通过使用进程将它们从堆中移除,这样它们就可以撤销彼此的工作 package javaapplication2; import java.util.Random; import java.util.concurrent.Execu
package javaapplication2;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;
public class JavaApplication2 {
public static void main(String[] args) {
NewThread T = new NewThread();
T.start();
NewThread c = new NewThread();
c.start();
MinHeap mt = new MinHeap(50);
T.Create(mt);
c.Consume(mt);
}
class NewThread extends Thread
{
NewThread()
{
}
public void run(MinHeap minHeap)
{
}
public void Create(MinHeap minHeap)
{
Random rand = new Random();
int randNum = rand.nextInt(40) + 1;
System.out.println("num = " + randNum);
int i =0;
Node n = new Node();
n.setID(randNum);
minHeap.first(n);
while (minHeap.getSize() < 15)
{
n = new Node();
randNum = rand.nextInt(40) + 1;
n.setID(randNum);
minHeap.insert(n);
System.out.print("Input: " + randNum + " Heap = ");
minHeap.print();
try{Thread.sleep(800);}catch(Exception e){}
}
minHeap.print();
minHeap.remove();
System.out.println("========= size = " + minHeap.getSize());
minHeap.print();
}
public void Consume(MinHeap minHeap)
{
while (minHeap.getSize() > 0)
{
System.out.print("Consume - Heap = ");
minHeap.remove();
minHeap.print();
try{Thread.sleep(800);}catch(Exception e){}
}
}
}
PackageJavaApplication2;
导入java.util.Random;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入java.util.logging.Level;
导入java.util.logging.Logger;
公共类JavaApplication2{
公共静态void main(字符串[]args){
NewThread T=newnewthread();
T.开始();
NewThread c=新的NewThread();
c、 start();
MinHeap mt=新的MinHeap(50);
T.Create(mt);
c、 消耗(mt);
}
类NewThread扩展线程
{
NewThread()
{
}
公共无效运行(MinHeap MinHeap)
{
}
公共void创建(MinHeap MinHeap)
{
Random rand=新的Random();
int randNum=rand.nextInt(40)+1;
System.out.println(“num=“+randNum”);
int i=0;
节点n=新节点();
n、 setID(randNum);
第一(n);
while(minHeap.getSize()<15)
{
n=新节点();
randNum=rand.nextInt(40)+1;
n、 setID(randNum);
minHeap.insert(n);
系统输出打印(“输入:“+randNum+”Heap=“”);
print();
试试{Thread.sleep(800);}catch(异常e){}
}
print();
minHeap.remove();
System.out.println(“==========size=“+minHeap.getSize());
print();
}
公共void消耗(MinHeap MinHeap)
{
while(minHeap.getSize()>0)
{
System.out.print(“Consume-Heap=”);
minHeap.remove();
print();
试试{Thread.sleep(800);}catch(异常e){}
}
}
}
您需要在线程的run()
方法中执行Create()
和Consume
方法。因为现在调用T.Create()
和c.Consume()
以通常的串行方式。首先,发布可以在其他任何计算机上运行的代码是一个好主意(作为所需的最少代码量),以便我们能够更好地调试您的问题
这些链接可能有助于:
NewThread
?Create()和Consume()是什么
do?请提供一个。Create将对象放在堆上,consume从堆中删除对象。我希望它们同时工作,这样一个基本上会撤消另一个的工作。我正在尝试找出如何使这两个函数同时运行。现在,一个进程完全运行,另一个进程运行。我不是在找描述。我在找一个。@有些方法是一个接一个地执行的,因为你一个接一个地调用它们。你在这里没有正确地使用线程。要使thread对象将某些内容作为一个单独的线程,你需要将这些内容放入run()
方法(没有任何输入参数)。之后,当您调用start()
code thatrun()时
方法将被禁用executed@Some_Dude两个线程不会同时运行。一次只运行一个线程,此顺序由线程调度程序决定。另一个线程的执行可能会在第一个线程完成其任务之前开始。这就像这个线程的一部分,然后是那个线程的一部分,依此类推……
您没有控制权默认情况下,我的意思是将c.start()
放在t.start()之后
并不意味着c在t完成其任务后启动
。您还需要重写不带参数的run方法。是的,这两个方法都是在主线程的上下文中顺序调用的。我建议从阅读Oracle手册了解其工作原理开始玩线程,然后玩一些简单易懂的小示例首先,遵循Java命名约定和代码风格也是一个好主意。这确实有助于其他人阅读您的代码,并避免诸如混合类和实例之类的错误。