Home

NUNU

05 Dec 2017

多线程的基础使用

大量的查询运算,java的单线程已经吃不消了。为了充分使用服务器的资源,我们可以采用多线程。 单线程查询4000 个格点的时候,每次都需要读960个文件。 这样的效率是非常低的。

下面介绍多线程的简单实用

1. 继承Thread类

public class MyThread extends Thread {
    public void run() {
        System.out.println("MyThread.run()");
    }
}

// main

public static void main(String[] args) {
    MyThread myThread1 = new MyThread();
    MyThread myThread2 = new MyThread();
    myThread1.start();
    myThread2.start();
}

2. 实现Callable类

Callable类只有一个方法 call(),同时使用了泛型函数

public class MyCallable implements Callable<String> {
    private String taskNum;

    public MyCallable(String taskNum) {
        this.taskNum = taskNum;
    }

    public String call() throws Exception {
        System.out.println(">>>" + taskNum + "任务启动");
        Date dateTmp1 = new Date();
        Thread.sleep(1000);
        Date dateTmp2 = new Date();
        long time = dateTmp2.getTime() - dateTmp1.getTime();
        System.out.println(">>>" + taskNum + "任务终止");
        return taskNum + "任务返回运行结果,当前任务时间【" + time + "毫秒】";
    }
}

调用方式:

public static void main(String[] args) throws Exception {
    //创建一个线程池
    ExecutorService executor = Executors.newFixedThreadPool(10);
    // 创建多个有返回值的任务.。 这里使用list是一样的结果
    Map<String, FutureTask<String>> tasks = new HashMap<String, 
        FutureTask<String>>();
    for (int i = 0; i < 10; i++) {
        MyCallable myCallable = new MyCallable("xxx" + i);
        FutureTask<String> task = new FutureTask<String>(myCallable);
        tasks.put("i" + i, task);
        if (!executor.isShutdown()) {
            executor.submit(task);
        }
    }
    // 关闭线程池
    executor.shutdown();
    // 获取所有并发任务的运行结果
    Set<String> keys = tasks.keySet();
    for (String para : keys) {
        FutureTask<String> futureTask = tasks.get(para);
        String ret = futureTask.get();
        System.out.println(ret);
    }
}

运行结果:

>>>xxx0任务启动
>>>xxx2任务启动
>>>xxx3任务启动
>>>xxx1任务启动
>>>xxx4任务启动
>>>xxx5任务启动
>>>xxx6任务启动
>>>xxx7任务启动
>>>xxx8任务启动
>>>xxx9任务启动
>>>xxx4任务终止
>>>xxx1任务终止
>>>xxx3任务终止
>>>xxx2任务终止
>>>xxx0任务终止
>>>xxx9任务终止
xxx9任务返回运行结果,当前任务时间【1008毫秒】
xxx0任务返回运行结果,当前任务时间【1009毫秒】
xxx1任务返回运行结果,当前任务时间【1008毫秒】
xxx2任务返回运行结果,当前任务时间【1009毫秒】
xxx3任务返回运行结果,当前任务时间【1009毫秒】
xxx4任务返回运行结果,当前任务时间【1001毫秒】
>>>xxx8任务终止
>>>xxx7任务终止
>>>xxx6任务终止
>>>xxx5任务终止
xxx5任务返回运行结果,当前任务时间【1011毫秒】
xxx6任务返回运行结果,当前任务时间【1011毫秒】
xxx7任务返回运行结果,当前任务时间【1011毫秒】
xxx8任务返回运行结果,当前任务时间【1011毫秒】

Process finished with exit code 0


业精于勤,荒于嬉; 行成于思,毁于随。
pnunu at 22:22

Flag Counter