当前位置: 首页 > 知识库问答 >
问题:

我试图从线程1调用线程2(在一个循环中调用五次),但线程2只在线程1的循环完成后才开始执行

魏凡
2023-03-14

我有一个2线程定义在一个android活动。这两个线程都创建为可运行实例。线程1是名为“timer1”的可运行对象(使用匿名内部类创建),线程2(分配给可运行对象“timer2”)使用线程2的处理程序(使用post()方法)从线程1调用。

这是第一个线索:

timer1 = new Runnable() {
        @Override
        public void run() {
            timer2 = new MyRunnable();

            for(int i = 0; i < 5; i++){
                tempHandler.post(timer2);
                try{
                    Thread.sleep(1000);
                } catch(Exception e) {
                    System.out.println(e.getMessage());
                }
            }

        }
    };

这是第二个线索:

public class MyRunnable implements Runnable {

    public MyRunnable() {
        tempHandler = new Handler();
    }

    @Override
    public void run() {
        if(Looper.myLooper() == null) {
            Looper.prepare();
        }
        long startTime = System.currentTimeMillis();
        long stopTime = System.currentTimeMillis();
        long elapsedTime = stopTime - startTime;

        System.out.println("Array traversal time: " + String.valueOf(elapsedTime));
        System.out.println("Exited thread 2");

        Looper.loop();
    }
}

共有1个答案

章睿
2023-03-14

您还没有显示启动线程的代码,但听起来似乎您假设runnablethread。他们不是。

runnable就是这样:可以通过调用run()方法来运行的东西。但它运行在您调用它的同一个线程中。

一个例子,看看我在说什么:

public static void main(String[] args) {
    final Thread mainThread = Thread.currentThread();
    Runnable r = new Runnable() {
        @Override
        public void run() {
            System.out.println(mainThread);
            System.out.println(Thread.currentThread());
            System.out.println(mainThread == Thread.currentThread());
        }
    };
    r.run();
}
Thread[main,5,main]
Thread[main,5,main]
true
    Thread newThread = new Thread(r);
    newThread.start();
Thread[main,5,]
Thread[Thread-0,5,main]
false

成功-我们有两个不同的线程!

注意:确保调用的是线程对象的start(),而不是run()。这是代码无法工作的另一个可能原因。尽管Thread对象有一个公共的run()方法,但这是Java中的一个历史错误;您永远不应该调用它,因为它只在当前线程上运行代码,而不启动新的线程。

 类似资料:
  • 我需要编写一个扩展Thread类的应用程序。我的类在实例化时接受一个整数(即100)<代码>(MyThread myt=新的MyThread(100);) 这个整数将是这个类循环并打印消息的次数。消息应该是“线程正在运行…100”。100将是我传入构造函数的任何数字。如果数字是150,那么输出应该是“线程正在运行…100”。我应该使用main方法来测试这个类。在主线程中,我将启动两个线程,一个线程

  • 所以这是我需要解决的大事。我有Visual C#应用程序。在这个应用程序中,用户输入数据并单击Execute。当他们点击执行时,核心方法开始在新线程中,在那个线程和方法是一个循环。不断地使用方法调用器,我向UserForm发送更新,循环实际上在做什么。例如,像这样,我在每个cicle中更新progressBar。

  • 我是新来Java的,最近在学校学习多线程,我尝试创建一个小程序,可以将任务分割成一个小的部分,使用循环在多个线程中运行。问题是,在循环之后,我需要将研究结果求和并打印出来,在线程完成之前,循环下的打印运行。而我的同学所做的只是在打印结果之前添加睡眠,但是当线程花费太长时它就不起作用了。在运行其他代码之前,是否需要等待所有的线程在循环中首先完成?

  • 我正在为我的公司开发一个“多层”GUI来监控温度和状态。因为我是python编程新手,所以我的代码需要一些帮助。 代码由类构成。“Main”初始化主窗口(tkinter)并创建其他要显示的帧(如果需要)。除“canvas”外,其他每个类都是一个框架,它将显示不同的内容。 每个画布都包含一个图像和一些文本/可变文本。线程用于从数据库获取数据并更改画布中的文本。 每次线程访问画布并尝试更改文本或创建新

  • 问题内容: 我写一个简单的应用程序,它涉及三个线程: ,和。 是 生成* 并馈给的生成器类。 * 消耗了 计算平均值。我的号码已经使用该饲料用。用途吃起来。 问题是:: 如果平均值超过中的1E5 ,我想表示停止产生数字。我有一个在需要被打开。我该如何实现? PS:该代码将永久运行,而无需在控制台上打印任何内容,我至今仍未弄清原因!! 问题答案: 您可以使用并将它传递给两个线程,原子类型是可访问的,

  • 我试图用Java实现一个简单的客户机-服务器应用程序。 这是代码: 客户端.java 服务器.java 这是主要类: 代码的逻辑很简单:客户端和服务器都在等待< code>while(true)循环中的消息。 服务器的< code>listen方法中的< code>while循环执行得很好。但是,在< code>listenForMessages方法中,循环似乎只执行一次。我只看到一个“在循环”印

  • 我正在尝试编写一个线程,该线程将在我的主程序的后台运行,并监视某些内容。在某个时候,主程序应该向线程发出安全退出的信号。下面是一个以固定间隔将本地时间写入命令行的最小示例。 当“on”变量没有通过引用传递时,此代码会编译并产生预期的结果,只是线程永远不会终止。一旦变量通过引用传递,我就会收到编译器错误 您能建议一种修复此代码的方法吗? 额外的问题:哪里出了问题,为什么它可以与std::ref一起工

  • 问题内容: 如何在Android中从辅助线程调用主线程? 问题答案: 最简单的方法是从线程中调用runOnUiThread(…)