1.线程是什么?

线程被称为轻量级进程,是程序执行的最小单位,它是指在程序执行过程中,能够执行代码的一个执行单位。每个程序程序都至少有一个线程,也即是程序本身

2.线程状态

Java语言定义了5种线程状态,在任意一个时间点,一个线程只能有且只有其中一个状态。,这5种状态如下:

(1)新建(New):创建后尚未启动的线程处于这种状态

(2)运行(Runable):Runable包括了操作系统线程状态的Running和Ready,也就是处于此状态的线程有可能正在执行,也有可能正在等待着CPU为它分配执行时间。

(3)等待(Wating):处于这种状态的线程不会被分配CPU执行时间。等待状态又分为无限期等待和有限期等待,处于无限期等待的线程需要被其他线程显示地唤醒,没有设置Timeout参数的Object.wait()、没有设置Timeout参数的Thread.join()方法都会使线程进入无限期等待状态;有限期等待状态无须等待被其他线程显示地唤醒,在一定时间之后它们会由系统自动唤醒,Thread.sleep()、设置了Timeout参数的Object.wait()、设置了Timeout参数的Thread.join()方法都会使线程进入有限期等待状态。

(4)阻塞(Blocked):线程被阻塞了,“阻塞状态”与”等待状态“的区别是:”阻塞状态“在等待着获取到一个排他锁,这个时间将在另外一个线程放弃这个锁的时候发生;而”等待状态“则是在等待一段时间或者唤醒动作的发生。在程序等待进入同步区域的时候,线程将进入这种状态。

(5)结束(Terminated):已终止线程的线程状态,线程已经结束执行。

下图是5种状态转换图:

3.线程同步方法

线程有4中同步方法,分别为wait()、sleep()、notify()和notifyAll()。

wait():使线程处于一种等待状态,释放所持有的对象锁。

sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用它时要捕获InterruptedException异常,不释放对象锁。

notify():唤醒一个正在等待状态的线程。注意调用此方法时,并不能确切知道唤醒的是哪一个等待状态的线程,是由JVM来决定唤醒哪个线程,不是由线程优先级决定的。

notifyAll():唤醒所有等待状态的线程,注意并不是给所有唤醒线程一个对象锁,而是让它们竞争。

4.创建线程的方式

在JDK1.5之前,创建线程就只有两种方式,即继承java.lang.Thread类和实现java.lang.Runnable接口;而在JDK1.5以后,增加了两个创建线程的方式,即实现java.util.concurrent.Callable接口和线程池。下面是这4种方式创建线程的代码实现。

4.1继承Thread类

//继承Thread类来创建线程
public class ThreadTest {public static void main(String[] args) {//设置线程名字Thread.currentThread().setName("main thread");MyThread myThread = new MyThread();myThread.setName("子线程:");//开启线程
        myThread.start();for(int i = 0;i<5;i++){System.out.println(Thread.currentThread().getName() + i);}}
}class MyThread extends Thread{//重写run()方法public void run(){for(int i = 0;i < 10; i++){System.out.println(Thread.currentThread().getName() + i);}}
}

4.2实现Runnable接口

//实现Runnable接口
public class RunnableTest {public static void main(String[] args) {//设置线程名字Thread.currentThread().setName("main thread:");Thread thread = new Thread(new MyRunnable());thread.setName("子线程:");//开启线程thread.start();for(int i = 0; i <5;i++){System.out.println(Thread.currentThread().getName() + i);}}
}class MyRunnable implements Runnable {@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName() + i);}}
}

4.3实现Callable接口

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
//实现Callable接口
public class CallableTest {public static void main(String[] args) {//执行Callable 方式,需要FutureTask 实现实现,用于接收运算结果FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyCallable());new Thread(futureTask).start();//接收线程运算后的结果try {Integer sum = futureTask.get();System.out.println(sum);} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}
}class MyCallable implements Callable<Integer> {@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 0; i < 100; i++) {sum += i;}return sum;}
}

相较于实现Runnable 接口的实现,方法可以有返回值,并且抛出异常。

4.4线程池

线程池提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外开销,提交了响应速度。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
//线程池实现
public class ThreadPoolExecutorTest {public static void main(String[] args) {//创建线程池ExecutorService executorService = Executors.newFixedThreadPool(10);ThreadPool threadPool = new ThreadPool();for(int i =0;i<5;i++){//为线程池分配任务
            executorService.submit(threadPool);}//关闭线程池
        executorService.shutdown();}
}class ThreadPool implements Runnable {@Overridepublic void run() {for(int i = 0 ;i<10;i++){System.out.println(Thread.currentThread().getName() + ":" + i);}}}

转载于:https://www.cnblogs.com/zhou-test/p/9811771.html

创建多线程的4种方式相关推荐

  1. java多线程w3c_Java创建多线程的三种方式

    前言 这篇文章主要讲述线程的概念.组成.Java创建多线程的三种方式以及线程的类型. 线程概念 线程和进程的区别 **进程:**正在运行的程序,例如:你打开 的qq音乐.exe程序,其由PCB(进程控 ...

  2. java创建多线程的四种方式

    java多线程的创建方式是面试经常会被问到的一个问题,因此在这里我对java创建多线程的四种方式做一个简单的归纳与总结,便于复习. 一.继承Thread类创建多线程 ① 创建一个继承于Thread类的 ...

  3. 创建多线程的几种方式

    Java中多线程的创建有几种方式? 答:四种. 创建多线程的四种方式: 继承Thread类,实现Runnable接口,jdk5.0以后又增加了两种方式,实现Callable接口和使用线程池. 方式一: ...

  4. 创建多线程的四种方式

    创建多线程的四种方式 方式一:继承于Thread类 创建一个继承于Thread类的子类 重写Thread类的run()->将此线程执行的操作声明在run()中 创建Thread类的子类的对象 通 ...

  5. 多线程一,什么是多线程,创建多线程的几种方式

    文章目录 1 多线程相关概念 2 多线程概念 3 多线程优缺点 4 多线程实现方式 5 实现runnable和callable的区别 6 继承thread和实现runnable接口的区别 7 多线程匿 ...

  6. 【Java多线程】创建多线程的三种方式

    1.我的第一个多线程程序 方法一: extends Thread package cn.hanquan.test;public class StartThread extends Thread {@O ...

  7. 创建现成的四种方式 多线程与并发的基本概念:

    多线程与并发的基本概念: 多线程 一:什么是线程? 进程:进行中应用程序 线程:是进程组成者,一个进程中可能包含多个线程 cpu执行程序的最小单位是线程,cpu在同一时间内只能执行一个线程,在多个线程 ...

  8. java 多线程编程(包括创建线程的三种方式、线程的生命周期、线程的调度策略、线程同步、线程通信、线程池、死锁等)

    1 多线程的基础知识 1.1 单核CPU和多核CPU 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务.微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那 ...

  9. Java 并发 多线程:创建线程的四种方式

    Java 并发 多线程: 创建线程的四种方式 继承 Thread 类并重写 run 方法 实现 Runnable 接口 实现 Callable 接口 使用线程池的方式创建 1. 通过继承 Thread ...

最新文章

  1. R语言str_trim函数去除字符串中头部和尾部的空格
  2. 一个合格程序员该做的事情
  3. linux kill信号列表
  4. Aop动态代理解决问题
  5. 零基础建站第一季视频分享
  6. oracle+11g+rda,Oracle RDA 4.20 初体验
  7. inotify-tools对文件及目录访问进行记录
  8. java 接口 设计模式吗_JAVA接口设计模式-工厂模式
  9. RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势...
  10. opencv 物体形状匹配
  11. apo打印接口json参数_接口测试大全
  12. rocketmq在Kubernetes(k8s)中的集群配置,2m-2s-async:多Master多Slave模式,异步复制
  13. Div高度自适应内容高度
  14. Java学习手册:数据结构与算法汇总
  15. VS Code unins000尝试在目标目录创建文件时出错
  16. NOIP2004提高组一等奖名单[推荐]
  17. 使用EXCEL进行计数
  18. MySQL知道出生日期如何计算年龄
  19. Linux下sqlite3移植与编程
  20. Lisa新歌破吉尼斯世界纪录,MV播放量7460万,中国粉丝贡献大

热门文章

  1. CTFshow 文件包含 web78
  2. 【POJ3126 Prime Path】【POJ 3087 Shuffle'm Up】【UVA 11624 Fire!】【POJ 3984 迷宫问题】
  3. Codeforces Round #476 (Div. 2) A. Paper Airplanes
  4. 3.2 matlab用if语句实现选择结构
  5. MATLAB图像函数以及应用(第六章)边界问题
  6. github如何删除一个repository【找不到settings】
  7. shell处理curl返回数据_shell神器curl用法笔记
  8. These dependencies were not found: *!!vue-style-loader!css-loader?
  9. Linux的硬盘分区
  10. SQL中JOIN 的用法