java多线程(一)

偶尔善良 提交于 2019-11-30 00:13:29

一、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运行--------");
		}
	}

}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!