`

java多线程一:概念与原理

 
阅读更多

1、线程是什么?

    几乎所有的操作系统都支持同事运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程。

    多线程则扩展了多进程的概念。使得同一个进程可以同时并发处理多个任务。线程(Thread)也被成为轻量级的进程(lightweight process),线程是进程的执行单元。就想进程在操作系统中的地位一样,线程是程序中独立的并发的执行流。当程序被处理化后,主线程就被创建了。对于大多数应用程序来说,通常都会有一条主线程,但我们也可以在该进程中创建多条执行流,这些顺序执行流就是线程,每条线程都是相互独立的。

     线程是独立运行的,它不知道进程中是否还有其它线程存在。线程的执行是抢占式的,也就是说,当前运行的线程在任何时候都有可能被挂起,以便另外一个线程可以运行。

     简而言之:一个程序运行后至少有一个进程,而一个进程可以包含多个线程,但至少有一个线程。

2 、线程的创建和使用

     Java中使用Thread类来代表线程, 所有的线程对象都必须是Thread类或其子类的实例。每条线程的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序执行的代码)。Java使用run方法来封装这样一段程序流。

(1)、通过继承Thread类,并重写run方法来创建线程类,该run方法体就是代表了线程要完成的任务。所以我们把run方法称为线程体。

package com.yt.manager.thread;

/**
 * @Description: 通过继承Thread来创建线程类
 * @ClassName: FirstThread
 * @Project: base-info
 * @Author: zxf
 * @Date: 2011-7-12
 */
public class FirstThread extends Thread {

	// 重写run方法,run方法的方法体就是线程的执行体
	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			// 通过getName()方法来返回当前线程名
			System.out.println(this.getName() + "  " + i);
		}
	}

	public static void main(String[] args) {
		for (int i = 0; i < 100; i++) {
			// 也可以使用Thread.currentThread().getName()来获取当前的线程名
			System.out.println(Thread.currentThread().getName() + "  " + i);
			if (i == 20) {
				new FirstThread().run();
				new FirstThread().run();
			}
		}
	}
}

/**
 * 上面的程序显式的创建了两个子线程,但实际上程序至少有三个线程,程序显式的创建的两条子线程和主线程(main方法就代表线程的执行主题)。
 * 
 */

  (2)、实现Runnable接口来创建线程类,并实现该接口中的run方法,该run方法同样是该线程的执行体。

package com.yt.manager.thread;

/**
 * @Description:通过实现Runnable接口,并重写run()方法来创建线程类
 * @ClassName: SecondThread
 * @Project: base-info
 * @Author: zxf
 * @Date: 2011-7-12
 */
public class SecondThread implements Runnable {

	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			System.out.println(Thread.currentThread().getName() + "  " + i);
		}
	}

	public static void main(String[] args) {
		for (int i = 0; i < 100; i++) {
			System.out.println(Thread.currentThread().getName() + "  " + i);
			if (i == 20) {
				SecondThread st = new SecondThread();
				new Thread(st, "thread_1").start();
				new Thread(st, "thread_2").start();
			}
		}
	}

}

 

以上两种方式的对比:

(1)、采用继承Thread类方式的多线程:

      劣势是:因为线程已经继承了Thread类,所以不能再继承其他类。

      优势是:编写简单,如果需要访问当前的线程,无效使用Thread.currentThread()方法,直接使用this即可以获取当前线程的实例。

(2)、才用实现Runnable接口方式的多线程。

      优势是:线程实现了Runnable接口,还可以继承其他类。在这种方式下,一个多线程可以共享一个target对象,所以非常适合多个线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,更好的面向对象。

      劣势是:变成较为复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法来获取。


3、线程的生命周期:

       当线程被创建后,它既不是已启动就进入执行状态,也不会一直处于执行状态,在线程的生命周期中。它要经过新建(new)、就绪(Runnable)、运行(run)、阻塞(Blocked)、死亡(Dead)五种状态。尤其是线程在启动以后,它不会之一霸占这CPU独自运行,所以CPU要在多条线程之间切换,所以线程状态也会在运行、阻塞之间切换。

(1)、当程序通过new关键字创建了一个线程后,该线程就处于新建状态。此时他和其他Java对象一样,仅仅由JVM为其分配了内存,初始化了成员变量的值。此时的线程没有执行start()方法,所以程序不会执行线程体中的线程执行体。

(2)、当线程对象调用了start()方法之后,该线程就处于就绪状态,但是此时线程调度器还没有把该线程设置为当前线程,此时处于就绪状态。当一个线程从等待或者睡眠状态回来之后, 也会处于就绪状态。

(3)、线程调度器把处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run()方法中的代码。

(4)、线程在运行的时候被暂停,通常是为了等待某个时间的发生之后再继续运行。sleep、suspend、wait等方法都可以导致线程阻塞。

(5)、线程会以以下三种方式之一结束,结束后就处于死亡状态。

         1、run方法执行完成,线程正常结束。

        2、线程抛出一个未捕获的Exception或Error。

        3、直接调用线程的stop方法来结束该线程,该方法容易造成死锁,通常不推荐使用。

分享到:
评论

相关推荐

    Java多线程编程总结

    Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-...

    java多线程编程总结

    Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 ...

    java多线程笔记

    Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java...

    java线程详解

    Java线程:概念与原理 Java线程:创建与启动 Java线程:线程状态的转换 Java线程:线程的同步与锁 一、同步问题提出 二、同步和锁定 三、静态方法同步 四、如果线程不能不能获得锁会怎么样 五、何时需要同步...

    Java多线程编程实战指南(核心篇)

    Java多线程编程实战指南(核心篇) 高清pdf带目录 随着现代处理器的生产工艺从提升处理器主频频率转向多核化,即在一块芯片上集成多个处理器内核(Core),多核处理器(Multicore Processor)离我们越来越近了――如今...

    java多线程编程实战指南 核心篇 代码

    《Java多线程编程实战指南(核心篇)》以基本概念、原理与方法为主线,辅以丰富的实战案例和生活化实例,并从Java虚拟机、操作系统和硬件多个层次与角度出发,循序渐进、系统地介绍Java平台下的多线程编程核心技术及...

    Java多线程教程

    Thread概念 Thread实现方法 Thread生命周期 Thread的安全和锁 Concurrent包(安全集合类、安全Queue) 线程阻塞机制 线程池详解(原理,实际使用) 线程的监控,分析方法 扩展数据库连接池

    Java多线程编程指南

    《多线程编程指南》介绍了 SolarisTM 操作系统 (Solaris Operating System, Solaris OS)中 POSIX®线程和 Solaris 线程的多线程编程接口。本指南将指导应用程序程序员如何创建 新的多线程程序以及如何向现有的程序...

    面向对象与多线程java实验.zip

    由此了解软件开发的一般过程,深入理解面向对象语言的基本概念和基本原理,理解和掌握继承与多态、异常处理、输入输出流、GUI设计、JDBC数据库操作、网络编程、多线程等技术;熟练掌握在Java语言环境下,上述技术的...

    Java多线程与线程安全实践-基于Http协议的断点续传(源码)

    本毕业设计题目旨在研究和实现一个基于Java多线程与线程安全机制的断点续传下载工具。随着互联网的普及,文件的下载需求日益增加,而大文件的下载往往需要较长的时间,一旦出现网络中断或意外情况,就需要从头开始...

    一篇文章弄懂Java多线程基础和Java内存模型

    文章目录一、多线程的生命周期及五种基本状态二、Java多线程的创建及启动1.继承Thread类,重写该类的run()方法2.通过实现Runnable接口创建线程类3.通过Callable和Future接口创建线程三、Java内存模型概念四、内存间...

    java多线程

    文档详细讲解了 java多线程概念与原理。线程栈模型与线程变量。线程同步、状态、交互等。

    java应用与开发 Java实验,综合应用 运用Java语言的各方面知识解决实际问题,提高综合编程能力

    用途: 理解Java中的多线程编程和数据库操作,提高程序的并发性和数据存储能力。 实验六: 关键词: 网络Socket编程(选择) 内容关键词: 网络Socket编程,Java实验 用途: 学习Java中的网络编程,了解Socket通信原理和...

    Java多线程详细分析[张振华.Jack]

    概念 实现方法 生命周期 安全和锁 Concurrent包(安全集合类、安全Queue) 线程阻塞机制 线程池详解(原理,实际使用) 线程的监控,分析方法 扩展数据库连接池

    Java多线程与高并发入门到精通-视频教程网盘链接提取码下载.txt

    一门专注于教授Java多线程编程和高并发处理的课程。学习者将从入门到精通,掌握多线程的概念、原理和常用技术,学会如何编写高效、安全、可靠的多线程应用程序,以及解决高并发场景下的各种问题。通过实践项目和案例...

Global site tag (gtag.js) - Google Analytics