博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程(1)
阅读量:6313 次
发布时间:2019-06-22

本文共 3699 字,大约阅读时间需要 12 分钟。

hot3.png

线程和进程

线程和进程是两个非常容易混淆的概念。进程是资源分配的基本单位,又是调度运行的基本单位。进程则是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。

举个栗子来讲:打开QQ就是启动了一个进程,打开迅雷也是启动了一个线程;而迅雷创建一个下载任务就是创建一个线程,QQ打开消息对话框也是一个线程。

进程和线程就是父与子的关系,一个进程可以有多个线程,但是一个线程只能存在于一个进程当中。

创建一个线程

继承Thread创建

创建线程类

public class MyThread1 extends Thread {    private static int num = 0;    public MyThread1(){        num++;    }    @Override    public void run(){        System.out.println("线程"+num);    }}

创建线程对象并启动线程

public class MyThreadTest1 {    public static void main(String[] args) throws Exception {        MyThread1 thread1 = new MyThread1();        thread1.start();    }}

启动线程要用start()方法,如果是用run()启动的话,实际上就是在当前进程中执行了方法,并不会创建线程,如下代码:

public class MyThread1 extends Thread {    private String name;    public MyThread1(String name){        this.name = name;    }    @Override    public void run() {        System.out.println("name:"+name+" 子线程ID:"+Thread.currentThread().getId());    }}
public class MyThreadTest1 {    public static void main(String[] args) {        System.out.println("当前线程ID是 "+Thread.currentThread().getId());        MyThread1 myThread1 = new MyThread1("thread1");        myThread1.run();        MyThread1 myThread2 = new MyThread1("thread2");        myThread2.start();    }}

运行结果

当前线程ID是 1name:thread1 子线程ID:1name:thread2 子线程ID:13

实现Runnable创建

创建对象实现Runnable

public class Runnable1 implements Runnable {    @Override    public void run() {        System.out.println("子线程ID: " + Thread.currentThread().getId());    }}

创建并启动线程

public class RunnableTest1 {    public static void main(String[] args) {        Runnable1 runnable1 = new Runnable1();        new Thread(runnable1).start();    }}

通过实现Runnable接口定义一个子任务,然后交给Thread去执行。使用这种方法只能使用Runnable作为Thread的参数然后使用start()方法来创建一个线程,同样,如果直接调用Runnable的run()方法的话,当前进程中执行了方法,并不会创建线程。

实现Callable,创建带返回值的线程

创建线程类

import java.util.Date;import java.util.concurrent.Callable;public class Callable1 implements Callable {    private String taskName;    public Callable1(String taskName){        this.taskName = taskName;    }    @Override    public Object call() throws Exception {        System.out.println(">>>" + taskName + "任务启动");        Date date1 = new Date();        Thread.sleep(1000);        Date date2 = new Date();        long time = date2.getTime() - date1.getTime();        System.out.println(">>>" + taskName + "任务终止");        return taskName + "任务返回运行结果,当前任务时间【" + time + "毫秒】";    }}

使用线程池创建线程

import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class CallableTest1 {    public static void main(String[] args) throws ExecutionException, InterruptedException {        System.out.println(">>> 程序开始执行 >>>");        Date date1 = new Date();        int tasksize = 5;        // 创建一个线程池        ExecutorService threadPool = Executors.newFixedThreadPool(tasksize);        // 创建有多个返回值的任务        List
list = new ArrayList
(); for (int i = 0; i < tasksize; i++) { Callable1 c = new Callable1("task" + i); // 执行任务并获取Future对象 Future f = threadPool.submit(c); list.add(f); } // 关闭线程池 threadPool.shutdown(); // 获取所有运行结果 System.out.println(">>> 获取运行结果 >>>"); for (Future f : list) { System.out.println(">>> " + f.get().toString()); } Date date2 = new Date(); System.out.println(">>> 程序运行结束 >>> 运行时间: " + (date2.getTime() - date1.getTime()) + "ms"); }}

实现Callable接口,相当于实现Runable接口的方式,方法可以有返回值,而且可以抛出异常。但是执行的时候需要Future接口的支持来获取返回结果。

转载于:https://my.oschina.net/liangguoqiang/blog/1635040

你可能感兴趣的文章
Web语义化标准解读
查看>>
一份代码构建移动、桌面、Web全平台应用
查看>>
高性能 Lua 技巧(译)
查看>>
区分指针、变量名、指针所指向的内存
查看>>
异步编程的世界
查看>>
最近话题火爆的四件事你知道不?
查看>>
SpringBoot整合MyBatis
查看>>
云计算产业如何率先推行信用管理?
查看>>
Android 类库书签更新(一)
查看>>
Unity3D Input按键系统
查看>>
简单的一条SQL,不简单的做事思维 NOT IN 、NOT EXISTS、LEFT JOIN用法差别 ...
查看>>
DataWorks:任务未运行自助排查
查看>>
ionic/cordova热部署
查看>>
「镁客早报」特斯拉裁员,马斯克解释没有办法;微软推出Azure DevOps赏金计划...
查看>>
centos 7.4 使用 pgxc_ctl 安装与使用
查看>>
Redis 单key值过大 优化方式
查看>>
【数据库】表分区
查看>>
nutz-sqltpl 1.3.4.RELEASE 发布,在 Nutz 项目中“解决 Java 拼接 SQL”问题
查看>>
城市 | 800个地铁站数据透析的京沪白领图鉴:隐形土豪、无产中产阶级和猪猪女孩...
查看>>
前端脚本!网站图片素材中文转英文
查看>>