JAVA知识之多线程(一):基础知识

来源:互联网 发布:网络拓扑图图标素材 编辑:程序博客网 时间:2024/06/06 05:31

JAVA知识之多线程(一)

1.线程是什么?进程又是什么?

线程是程序运行的基本单位,所有的命令都在线程中运行。进程可以是独立运行的一段功能。

进程是由一个或者多个线程组成的,且一个进程至少包含有一个线程,可以认为线程是进程的子集。程序执行时,系统资源会分配给进程,同一个进程内的线程都使用这个进程里的系统资源。

定义很难理解是吧?我举个例子就简单多了:我们平时工作和生活中经常使用电脑,常常会同时运行多个程序,比如我们一边用QQ聊天,一边打开淘宝网挑选商品,那么浏览器和QQ程序就各自对应了一个进程,当我们给朋友发送了一个微笑的表情时,QQ进程里的发送消息线程就开始执行了,当我们在网上选中一个商品加入了购物车,那么浏览器就会执行发送添加商品到购物车的命令给网站。QQ和浏览器是两个独立的进程,即使其中一个进程关闭了,另一个进程也不会有影响,如果我关闭了QQ进程,那么发送消息和接收消息的线程就都不能工作了,但是浏览器依然可以上网购物,这就是线程和进程的区别了。

2.线程如何创建?

创建线程有三种办法:继承Thread类、实现Runnable接口、实现Callable接口。

  • 继承Thread类

    1.新建一个类,继承Thread类(注意Thread本身也是实现了Runnable接口)
    2.重写run()方法
    3.创建线程类的对象来创建线程
    4.调用线程对象的start()方法,线程开启

public class ThreadTest extends Thread {    //重写run方法,run方法内就是线程执行的代码    public void run(){        for(int i=1; i<=5; i++){            System.out.println("输出数字:"+ i);        }    }    public static void main(String args[]){        //创建线程对象        ThreadTest thread = new ThreadTest();        //调用start方法开启线程,此时线程是可运行状态(Runnable状态),等待执行,不一定立刻执行。        thread.start();    }}

程序执行run(),输出数字1~5,结果如下:

  • 实现Runnable接口
    1.新建一个类,实现Runnable接口
    2.重写run()方法
    3.创建Thread类的对象来创建线程,并把Runnable接口的实现类对象作为参数传入,定义线程执行的内容
    4.调用线程的start()方法,线程开启
public class RunnableTest implements Runnable {    //重写run方法,run方法就是线程内执行的代码    public void run(){        for(int i=1; i<=5; i++){            System.out.println("输出数字:"+ i);        }    }    public static void main(String args[]){        //创建线程执行的对象        RunnableTest r = new RunnableTest();        //创建线程的对象,传入线程执行的内容,也就是包含run方法内容的RunnableTest对象        Thread thread = new Thread(r);        //调用start方法开启线程,此时线程是可运行状态(Runnable状态),等待执行,不一定立刻执行。        thread.start();    }}

结果如下:

  • 实现Callable接口
    1.新建一个类,实现Callable接口
    2.重写call()方法
    3.创建callable接口子类对象
    4.创建线程池
    5.提交线程给线程池开启线程,并返回Future对象
    6.处理Future对象
public class CallableTest implements Callable {    //重写call方法,call方法就是线程内执行的代码,和run方法作用相同,可以有返回值    public String call() throws Exception{        return("这是个有返回值的线程");    }    public static void main(String args[]){        //创建线程池        ExecutorService es = Executors.newFixedThreadPool(3);        CallableTest c = new CallableTest();        //提交线程任务开启线程,返回Future对象        Future future = es.submit(c);        try {            String str = (String) future.get();            System.out.println(str);        } catch (Exception e) {            e.printStackTrace();        } finally{        // 线程池关闭            es.shutdown();        }    }}

结果如下:

3.总结

  • 继承Thread类和实现Runnable接口都是执行Runnable接口的run()方法,而实现Callable接口是执行Callable接口的call()方法。
  • run方法和call()方法都是封装了程序执行代码,真正启动线程的是start()方法,然后再由jvm去选择执行哪个线程的代码
  • run()方法没有返回值,不能抛出异常,call()方法可以有返回值,可以抛出异常。
  • 执行callable任务返回Future对象
0 0
原创粉丝点击