Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-使线程并发_Java_Multithreading - Fatal编程技术网

Java-使线程并发

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

如何使线程并发执行?我有下面的代码。过程T.Create(mt);在c.Consume(mt)开始之前完成其整个任务。我在T.Create(mt)中放置了一个sleep函数;函数,但c.Consume(mt)在完全完成之前仍不会启动。我试图通过创建进程将对象添加到堆中,并通过使用进程将它们从堆中移除,这样它们就可以撤销彼此的工作

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 that
run()时
方法将被禁用executed@Some_Dude两个线程不会同时运行。一次只运行一个线程,此顺序由
线程调度程序决定。另一个线程的执行可能会在第一个线程完成其任务之前开始。这就像
这个线程的一部分,然后是那个线程的一部分,依此类推……
您没有控制权默认情况下,我的意思是将
c.start()
放在
t.start()之后
并不意味着
c在t完成其任务后启动
。您还需要重写不带参数的run方法。是的,这两个方法都是在主线程的上下文中顺序调用的。我建议从阅读Oracle手册了解其工作原理开始玩线程,然后玩一些简单易懂的小示例首先,遵循Java命名约定和代码风格也是一个好主意。这确实有助于其他人阅读您的代码,并避免诸如混合类和实例之类的错误。