线程:线程是指进程内的一个执行单元,也是进程内的可调度实体. 表示程序执行的基本流程,cpu执行的基本单位java
进程:进程是一个具备独立功能的程序关于某个数据集合的一次运行活动api
在一个进程中能够包含若干个线程多线程
* 1.建立:在生成线程对象,并无调用该对象的start方法,这是线程处于建立窗台并发
* 2.就绪:当调用了线程对象的start方法后,该线程就进入了就绪状态,但此时线程调度程序尚未把该线程设置为当前线程,此时处于就绪状态,在线程运行以后,从等待或者睡眠中回来后,也会处于就绪状态框架
* 3.运行:线程调度程序将处于就绪状态的线程设置为当前线程,此时线程进入了一个运行状态,开始运行run方法体中的代码异步
* 4.阻塞:线程在运行的时候被暂停,一般是为了等待某个时间某项操做的发生以后再运行,sleep、suspend、wait等方法均可以致使阻塞(线程各个api方法如何使用?sleep和wait有什么区别?)jvm
* 5.死亡:若是一个线程的run方法执行结束或者滴啊用stop方法后,该线程就会死亡,对于已经死亡的线程,没法经过start进入就绪状态!!!ide
启动线程的惟一方法就是经过Thread类的start()实例方法,run方法只是把线程当成一个普通方法来执行,run方法执行完后,线程就进入阻塞状态测试
start和run 的区别:spa
* 每一个线程都是经过某个特定Thread对象所对应的方法run来完成其操做的,方法run()称为线程体。
* 经过调用Thread类的start()方法来启动一个线程
* 调用start方法后,线程会被放到等待队列,等待CPU调度,并不必定立刻要开始执行,只是将这个线程置于准备状态,而后 经过jvm,线程thread会调用run方法,执行本线程的线程体
* start用来启动线程,真正实现多线程运行,这是无需等待run方法体代码执行完毕,能够直接继续执行下面的代码,经过调用thread类的shart方法来启动一个线程,此时线程是就绪状态,并无运行,而后经过此thred类调用方法run来完成其运行操做的,这里的run方法称为线程体,它包含了要执行这个线程的内容,run方法运行结束,此线程终止,而后cpu再调度其余线程
* run方法当作普通方法的方式调用,程序仍是要顺序执行,要等待run方法执行完毕后,才能够继续执行下面的代码,程序中只有一个主线程,这样就没有达到写线程的目的
先调用start后调用run,这么麻烦,为了避免直接调用run?就是为了实现多线程的优势,没这个start不行。
总结来讲就是分时利用cpu,宏观上看起来让全部线程一块儿执行,也叫并发。其实是cpu各个时间片处理不一样的线程
1)继承Thread类,重写run方法,经过start启动线程(无返回值)
2)实现runnable接口,实现run方法,经过new Thread(Runnable target).start()方法来启动(无返回值)
3)使用ExecuterService,callback,Future实现由返回值的多线程
Executor框架是指java5中引入的一系列并发库中与executor相关的功能类,包括Executor、Executors、ExecutorService、CompletionService、Future、Callable等。
Executor中比较重要的类和接口:
1)Executor 接口
Executor接口是Executor框架中最基础的部分,定义了一个用户执行Runnable的execute方法。没有直接的实 现类,有一个重要的子接口ExecutorServices
2) ExecutorService
ExecutorService 继承自Executor接口,定义了终止、提交任务、跟踪任务返回结果等方法
ExecutorService 有一个子接口ScheduledExecutorService和一个抽象实现类AbstractExecutorService
3)Future表明异步任务的执行结果
4) ScheduledExecutorService 能够安排指定时间或周期性的执行任务的ExecutorService
多线程实现以下:
控制台输出结果为线程123交替输出
package com.cm.test; /** * java中的线程状态:建立,就绪,运行,阻塞,死亡 * 1.建立:在生成线程对象,并无调用该对象的start方法,这是线程处于建立窗台 * 2.就绪:当调用了线程对象的start方法后,该线程就进入了就绪状态,但此时线程调度程序尚未把该线程设置为当当前线程,此时处于就绪状态 * 在线程运行以后,从等待或者睡眠中回来后,也会处于就绪状态 * 3.运行:线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了一个运行状态,开始运行run方法体中的代码 * 4.阻塞:线程在运行的时候被暂停,一般是为了等待某个时间的发生以后再运行,sleep,suspend,wait等方法均可以致使阻塞 * 5.死亡:若是一个线程的run方法执行结束或者滴啊用stop方法后,该线程就会死亡,对于已经死亡的线程,没法经过start进入就绪状态 * * 实现线程的3中方式: * 1.线程1,2 实现runnable接口,重写run方法,实例化thread和接口实现,经过start方法执行 * 2.线程3,继承thread类 * 3.使用ExecutorService,callable,Future实现由返回结果的多线程(这次不详细多说) * * 启动线程的惟一方法就是经过Thread类的start()实例方法,run方法只是把线程当成一个普通方法来执行,run方法执行完后,线程就进入阻塞状态 * * * start和run方法的区别:每一个线程都是经过某个特定Thread对象所对应的方法run来完成其操做的,方法run()称为线程体。 * 经过调用Thread类的start()方法来启动一个线程 * * 调用start方法后,线程会被放到等待队列,等待CPU调度,并不必定立刻要开始执行,只是将这个线程置于准备状态,而后经过jvm, * 线程thrad会调用run方法,执行本线程的线程体 * * start用来启动线程,真正实现多线程运行,这是无需等待run方法体代码执行完毕,能够直接继续执行下面的代码,经过调用thread类的shart方法来 * 启动一个线程,此时线程是出于就绪状态,并无运行,而后经过此thred类调用方法run来完成其运行操做的,这里的run方法称为线程体,它包含了要执行这个线程 * 的内容,run方法运行结束,此线程终止,而后cpu再调度其余线程 * run方法当作普通方法的方式调用,程序仍是要要顺序执行,要等待run方法执行完毕后,才能够继续执行下面的代码,程序中只有一个主线程,这样就没有达到写线程的目的 * * * 多线程的概念:总结来讲就是分时利用cpu,宏观上看起来让全部线程一块儿执行,也叫并发。其实是cpu各个时间片处理不一样的线程 * @author admin * */ public class MultiThread { public static void main(String[] args) { Thread thread1 = new Thread(new Runnable1());// Thread(Runnable target) Thread thread2 = new Thread(new Runnable2()); Runnable3 r3 = new Runnable3();// 继承runnable类无需再实例化thread类,实例化runnable后直接调用start方法 thread1.start(); thread2.start(); r3.start(); } } class Runnable1 implements Runnable {// 实现runnable接口,jdk知道是多线程 @Override public void run() { for (int i = 0; i < 10000; i++) { System.out.println("进入线程runnable1运行---------"); } } } class Runnable2 implements Runnable { @Override public void run() { for (int i = 0; i < 10000; i++) { System.out.println("进入线程runnable2运行---------"); } } } class Runnable3 extends Thread { public void run() { for (int i = 0; i < 10000; i++) { System.out.println("进入线程runnable3运行--------"); } } }