线程无法正常工作?

时间:2017-03-25 21:35:32

标签: java multithreading

做一个线程问题,我不确定这是不是它应该如何,或者我编码不正确。根据我的理解,线程应该有多个方法同时进行,因此它们应该交织在一起。我的代码应该只需要一个字符并重复1000次,但它不是两个字母的不同变体,而是“a”一千次,然后“b”一千次。我的问题是什么?

主要方法

import java.util.*;
public class MainThread {

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

        Scanner answer = new Scanner(System.in);

        System.out.println("Give me a single character: ");
        char h = answer.next().charAt(0);
        System.out.println("Give me another single character: ");
        char a = answer.next().charAt(0);   

        MyThread t1 = new MyThread(h);
        MyThread t2 = new MyThread(a);

        t1.start(h);
        t2.start(a);        

        answer.close(); 
    }
}

我的线程课程

import java.util.*;
public class MyThread extends Thread{

    Scanner answer = new Scanner(System.in);

    public MyThread(char x) {
        // TODO Auto-generated constructor stub
    }


    public void Stored(char x){
        System.out.println("Type a single letter here: ");      
    }


    //modified run method 
    public void start(char x){

        for(int i = 0; i < 1000; i++){
            System.out.print(x);
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {              
                e.printStackTrace();
            }
            Thread.yield();
        }
    }   
}

4 个答案:

答案 0 :(得分:1)

你所做的不是多线程,而是你按顺序调用start方法,即为了并行运行多个线程,你需要覆盖run()方法MyThread 1}}类。

重要的一点是,run()线程时,JVM会自动调用 start方法,run()中的代码将在与主/其他线程并行,因此覆盖MyThread类中的run(),如下所示:

class MyThread extends Thread {

    private char x;

    public MyThread(char x) {
        this.x= x;
    }

    // Add run() method
    public void run() {

        for (int i = 0; i < 10; i++) {
            System.out.print(x);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {

                e.printStackTrace();
            }
            Thread.yield();
        }
    }
}

MainThread类:

public class MainThread {

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

        Scanner answer = new Scanner(System.in);

        System.out.println("Give me a single character: ");
        char h = answer.next().charAt(0);
        System.out.println("Give me another single character: ");
        char a = answer.next().charAt(0);   

        MyThread t1 = new MyThread(h);
        MyThread t2 = new MyThread(a);

        t1.start();//this calls run() of t1 automatically
        t2.start();//this calls run() of t2 automatically        

        answer.close(); 
    }
}

我建议您查看一下here,了解如何创建和启动Thread以及多线程如何工作。

答案 1 :(得分:1)

为了让线程并行运行,需要实现run方法而不是start

请参阅JavaDoc以了解Thread.start()

  

使该线程开始执行; Java虚拟机调用   该线程的run方法。

     

结果是两个线程同时运行:当前   thread(从调用返回到start方法)和   其他线程(执行其run方法)。

答案 2 :(得分:0)

首先,即使您实现了正确的多线程,也无法保证您所描述的行为永远不会发生。但是,它不应该是可重复的;)

解决方案是:不要覆盖start()但是覆盖run()方法。 线程构造函数应该接受参数,从main调用start()(并且没有带参数的新start方法!),run()实现并行执行的作业。因此,您可以访问在线程构造函数中设置的线程字段。

答案 3 :(得分:0)

已经解释了错误:正在覆盖start方法而不是run方法。无论如何,不​​建议扩展Thread类,因为您不想扩展其功能。

你只想使用一个Thread,所以一个更好的方法(IMO)是为线程提供一个Runnable:

    public static void main(String[] args) {
        // ...
        Thread t1 = new Thread(new MyRunnable(h));
        t1.start();
    }

Runnable(在生产代码中使用更好的名称):

public class MyRunnable implements Runnable {

    private final char ch;

    public MyRunnable(char theChar) {
        ch = theChar;
    }

    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            ...
        }
    }

使用Lambda可以改进这一点,但这不是重点

更多:"implements Runnable" vs. "extends Thread"