线程状态,开启子线程的3种方式(Callable)

(理理基础是很有必要的)


先看一张非常好的图

线程状态,开启子线程的3种方式(Callable)

注意,当你start一个线程,他只是处于可运行状态,不一定会立刻执行,这取决于操作系统分配给你的时间


创建方式1,继承Thread

class MyThread extends Thread {
    @Override
    public void run() {
        //do some thing in the 子线程
        System.out.print("lalala");
    }
}

MyThread m = new MyThread();
m.start();

创建方式2,实现Runnable接口

class MyThread implements Runnable {
    @Override
    public void run() {
        //do some thing in the 子线程
        System.out.print("lalala");
    }
}

Thread t = new Thread(new MyThread());
t.start();

可以这样简写

new Thread(new Runnable() {
    @Override
    public void run() {
        //do some thing in the 子线程
        System.out.print("lalala");
    }
}).start();

实现Callable接口,重写call()方法

class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        //do something here,and return your result,我们假设取得的是"武林外传"
        return "武林外传";
    }
}

MyCallable mCallable = new MyCallable();
ExecutorService mExecutorService = Executors.newSingleThreadExecutor();
Future<String> mFuture = mExecutorService.submit(mCallable);

try {
    Log.i("xbh", mFuture.get());
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
}
Callable可以在任务完成后提供一个返回值,采用泛型,可以指定类型,我们这里指定的是String

call()可以抛出异常

运行Callable可以拿到一个Future对象,子线程真正的执行是mFuture.get()这句话


以上3种方法,见仁见智,都挺不错的,不是说一定没rxjava好