我有多个线程,但它们无法一起工作

时间:2019-08-30 08:41:27

标签: java android multithreading

我正在尝试通过多线程打印这些Log.w("aa",String.valueOf(x));Log.w("bb",String.valueOf(x));,但应该一起使用,但不能。

Logcat结果

2019-08-30 11:28:28.885 4554-4554/com.test.app W/bb: 0
2019-08-30 11:28:28.885 4554-4554/com.test.app W/bb: 1
2019-08-30 11:28:28.885 4554-4554/com.test.app W/bb: 2
2019-08-30 11:28:28.885 4554-4554/com.test.app W/bb: etc... to 999
2019-08-30 11:28:28.909 4554-4554/com.test.app W/aa: 0
2019-08-30 11:28:28.909 4554-4554/com.test.app W/aa: 1
2019-08-30 11:28:28.909 4554-4554/com.test.app W/aa: 2
2019-08-30 11:28:28.909 4554-4554/com.test.app W/aa: etc... to 999

但是应该这样混合,不要在结束时不要等待第一个线程

2019-08-30 11:28:28.885 4554-4554/com.test.app W/aa: 0
2019-08-30 11:28:28.885 4554-4554/com.test.app W/bb: 0
2019-08-30 11:28:28.885 4554-4554/com.test.app W/aa: 1
2019-08-30 11:28:28.885 4554-4554/com.test.app W/bb: 1
2019-08-30 11:28:28.909 4554-4554/com.test.app W/aa: 2
2019-08-30 11:28:28.909 4554-4554/com.test.app W/bb: 2
2019-08-30 11:28:28.909 4554-4554/com.test.app W/aa: 3
2019-08-30 11:28:28.909 4554-4554/com.test.app W/bb: 3
etc...

代码

    Thread a = new Thread() {
        @Override
        public void run() {
            Log.i("Thread", "Running");
            try {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        for(int x = 0 ; x < 1000 ; x++){
                            Log.w("aa",String.valueOf(x));
                        }
                    }
                });

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
    Thread b = new Thread() {
        @Override
        public void run() {
            Log.i("Thread", "Running");
            try {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        for(int x = 0 ; x < 1000 ; x++){
                            Log.w("bb",String.valueOf(x));
                        }
                    }
                });

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
    a.start();
    b.start();

2 个答案:

答案 0 :(得分:2)

由于runOnUiThread,您的代码在MainThread中运行。

您需要删除runOnUiThread

new Thread(new Runnable() {
            public void run() {
                for(int x = 0 ; x < 3 ; x++){
                    Log.w("aa",String.valueOf(x));
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

new Thread(new Runnable() {
    public void run() {
        for(int x = 0 ; x < 3 ; x++){
            Log.w("bb",String.valueOf(x));
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}).start();

}

但是,如果要在Android中进行后台工作,则应使用AsyncTask或rxJava。

答案 1 :(得分:0)

为什么需要runOnUiThread。两者都在调用主线程。如果您不执行任何与UI更改相关的操作,则无需runOnUiThread即可执行此操作。没有runOnUiThread,两个线程可以同时工作。