java多线程(一)

1、Java线程       

        线程:线程是指进程内的一个执行单元,也是进程内的可调度实体. 表示程序执行的基本流程,cpu执行的基本单位java

        进程:进程是一个具备独立功能的程序关于某个数据集合的一次运行活动api

        在一个进程中能够包含若干个线程多线程

2、线程的生命周期(状态)

        * java中的线程状态:建立,就绪,运行,阻塞,死亡

        * 1.建立:在生成线程对象,并无调用该对象的start方法,这是线程处于建立窗台并发

        * 2.就绪:当调用了线程对象的start方法后,该线程就进入了就绪状态,但此时线程调度程序尚未把该线程设置为当前线程,此时处于就绪状态,在线程运行以后,从等待或者睡眠中回来后,也会处于就绪状态框架

        * 3.运行:线程调度程序将处于就绪状态的线程设置为当前线程,此时线程进入了一个运行状态,开始运行run方法体中的代码异步

        * 4.阻塞:线程在运行的时候被暂停,一般是为了等待某个时间某项操做的发生以后再运行,sleep、suspend、wait等方法均可以致使阻塞(线程各个api方法如何使用?sleep和wait有什么区别?)jvm

        * 5.死亡:若是一个线程的run方法执行结束或者滴啊用stop方法后,该线程就会死亡,对于已经死亡的线程,没法经过start进入就绪状态!!!ide

3、线程的启动方式:

        启动线程的惟一方法就是经过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各个时间片处理不一样的线程

 

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

}
相关文章
相关标签/搜索