`

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多线程操作数据库的应用程序,深入探讨其背后的原理、实现细节以及潜在的挑战。 #### 核心知识点: 1. **多线程基础**:多线程是Java编程中的一个重要概念,允许程序同时执行多个任务。在...

    java多线程的讲解和实战

    本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者以及希望深入理解多线程的开发者。 1. **线程的基本概念**:线程是程序执行的最小单位,一个进程中可以有多个线程同时运行。Java...

    java多线程经典案例

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...

    Java多线程基础学习指南:原理、实现与实战

    内容概要:本文详细介绍了Java多线程的基本概念、实现方式、线程控制方法、线程同步、线程池及其应用。首先解释了线程的概念及其优势,接着讲述了如何通过继承Thread类、实现Runnable接口和使用Callable接口来创建多...

    Java多线程编程经验

    ### Java多线程编程经验 #### 一、Java线程:概念与原理 现代操作系统都是多任务操作系统,其中多线程是一种重要的实现多任务的方式。线程是进程内的一个执行单位,一个进程可以包含多个线程。例如,在Java应用...

    java线程详解

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

    java多线程分页查询

    #### 二、Java多线程分页查询原理及实现 ##### 1. 分页查询基础概念 分页查询是指在查询数据时,将数据分成多个页面展示,而不是一次性返回所有数据。这种方式能够有效地减少单次查询的数据量,从而提高查询速度和...

    java多媒体与多线程处理实验

    ### Java多媒体与多线程...通过本次实验,学生不仅掌握了Java多线程编程的基础知识,还学会了如何利用多线程优化程序性能,特别是在多媒体应用领域,如动画、音视频处理等,为后续更复杂的应用开发奠定了坚实的基础。

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...

    Java 多线程 PPT

    本文将深入探讨Java多线程的相关概念、线程类和接口的使用,以及线程的同步与互斥。 首先,我们需要理解进程与线程的基本概念。程序是一组静态指令的集合,而进程则是程序在执行过程中的一个实例,拥有独立的内存...

    java多线程学习资料

    本文将深入探讨Java多线程的基础概念、基本原理及其在实践中的应用。 #### 二、核心概念 - **进程**: 是操作系统中的一个独立执行单元,拥有自己的内存空间。在多任务操作系统中,可以同时运行多个进程。 - **线程*...

    java 多线程示例

    Java多线程是Java编程中的重要概念,尤其在开发高...通过`lec22`中的示例,你可以亲手实践这些概念,深入理解Java多线程的原理和应用。不断练习和探索,你将能够熟练地在实际项目中运用这些知识,提升你的编程技能。

    java多线程.pdf

    本文将根据提供的文件信息,深入探讨Java多线程的相关概念和技术细节。 #### 二、Java线程基础 ##### 1. 什么是线程? 线程是进程中的最小执行单元,是进程内部的一次独立的控制流程。在Java中,每个进程至少有一...

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

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

    java多线程进阶

    Java多线程是Java编程中的核心概念,尤其对于高级开发者来说,掌握多线程的深入理解和应用至关重要。这本书“java多线程进阶”显然旨在帮助读者深化这方面的理解,打通编程中的“任督二脉”,使开发者能够更加熟练地...

    java多线程编程

    线程池是Java多线程处理的一种优化策略,通过复用已创建的线程来减少线程创建和销毁的开销。Java提供`ExecutorService`接口和`Executors`工厂类来创建线程池。常见的线程池类型有: 1. **FixedThreadPool**:固定...

    JAVA多线程总结

    本篇总结涵盖了Java多线程的基础概念、创建与启动、线程调度、同步与协作以及新特性。 **一、Java线程:概念与原理** 1. **线程与进程**: - **进程**:是操作系统资源分配的基本单位,每个进程都有独立的内存...

    Java多线程原理.pdf

    Java 多线程原理是一种基于 Java 语言的多线程编程技术,旨在提高程序的执行效率和响应速度。该技术可以使程序同时执行多个任务,从而提高系统的整体性能。 多线程编程的重要概念 1. 进程(Process):程序在内存...

Global site tag (gtag.js) - Google Analytics