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
- JAVA知识之多线程(一):基础知识
- Java之多线程(一)
- JAVA之多线程(一)
- Java之多线程(一)
- Java基础知识之多线程(1)
- Java基础知识之多线程(2)
- Java基础知识之多线程(二)
- JAVA之多线程(一)
- JAVA知识之多线程(二):生命周期和守护线程
- JAVA知识之多线程(四):线程池
- Java基础笔记之多线程(一)
- java专题(一)之多线程
- Java之多线程学习(一)
- Java回炉之多线程(一)
- java多线程(一)之多线程基础
- JAVA知识之多线程(三):同步和锁
- JAVA知识之多线程(五):计时器功能
- java基础之多线程(一)
- ERP浅谈之报表开发上
- Java 集合体系详解——List体系有序集合
- ABP学习笔记之搭建APB框架
- Oracle 自定义异常
- 为一个物体添加子物体
- JAVA知识之多线程(一):基础知识
- count count_if
- Java学习笔记之 Map取出元素的三种方式
- HTTPS免费证书StartSSL申请全过程
- Deeplab 在Qt Creator下编译报错undefined reference to Mat_xxx
- Dagger2使用
- 学习JavaScript设计模式(七)
- Delphi 10.2 Tokyo 下载破解激活
- 深入对象与类的关系理论篇(序列化与类的关系)