一、Java线程
线程:线程是指进程内的一个执行单元,也是进程内的可调度实体. 表示程序执行的基本流程,cpu执行的基本单位
进程:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动
在一个进程中可以包含若干个线程
二、线程的生命周期(状态)
* java中的线程状态:创建,就绪,运行,阻塞,死亡
* 1.创建:在生成线程对象,并没有调用该对象的start方法,这是线程处于创建窗台
* 2.就绪:当调用了线程对象的start方法后,该线程就进入了就绪状态,但此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态,在线程运行之后,从等待或者睡眠中回来后,也会处于就绪状态
* 3.运行:线程调度程序将处于就绪状态的线程设置为当前线程,此时线程进入了一个运行状态,开始运行run方法体中的代码
* 4.阻塞:线程在运行的时候被暂停,通常是为了等待某个时间某项操作的发生之后再运行,sleep、suspend、wait等方法都可以导致阻塞(线程各个api方法如何使用?sleep和wait有什么区别?)
* 5.死亡:如果一个线程的run方法执行结束或者滴啊用stop方法后,该线程就会死亡,对于已经死亡的线程,无法通过start进入就绪状态!!!
三、线程的启动方式:
启动线程的唯一方法就是通过Thread类的start()实例方法,run方法只是把线程当成一个普通方法来执行,run方法执行完后,线程就进入阻塞状态
start和run 的区别:
* 每个线程都是通过某个特定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各个时间片处理不同的线程
Java实现多线程的方式
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运行--------");
}
}
}
来源:oschina
链接:https://my.oschina.net/u/2248830/blog/718303