Java 多线程 编程 教程

多线程编程的含义:将程序任务分成几个并行的子任务,特别是在网络编程中,很多功能都是要并发执行的。本节课将从线程的概念、开发方法及运行来讲解。

  • 线程的概念:包括进程和线程的区别、线程的概念、运行状态和优先级
  • 线程的开发方法:继承Thread和实现Runnable、定时器TimberTask以及线程组ThreadGroup和线程池
  • 线程的运行:线程的启动、停止、休眠、挂起、同步机制

一、线程的概念

1、进程与线程的区别

a)进程。大多数操作系统中都可以创建多个进程。每当启动一个程序,它可以为即将开始的每项任务创建一个进程,并允许他们同时运行。当一个程序被阻塞时,另一个进程还可以运行,以增加资源利用率。每个进程都要占用相当一部分处理器时间和内存资源。进程之间通信不方便。

b)线程。线程也成为轻型进程。因为线程只能在单个进程的作用域内活动,所以创建线程比创建进程要廉价。线程允许协作与交换数据。线程需要操作系统的支持,不是所有的机器都提供线程。

2、线程的概念

线程是彼此相互独立的、能够独立运行的子任务,并且每个线程都有自己的调用栈。所有多任务是通过周期性地将CPU时间片切换到不同的子任务,虽然从微观上看来,单核的CPU上只运行一个子任务,但是从宏观来看,每个子任务似乎都在同时连续运行。

我们现在使用的大多操作系统都是属于多任务、分时操作系统。正是由于这种操作系统的出现才有了多线程的概念。

3、线程的运行状态

在Java中,多线程就是一个类或者一个程序执行或管理多个线程执行任务的能力,每个线程可以独立于其他线程而独立运行,当然也可以和其他线程协作运行,一个类控制着它的所有线程,可以决定哪个线程得到优先级,那个线程可以访问其他类的资源,哪个线程开始执行,哪个线程保持休眠。线程的运行机制如下:

线程的状态表示线程正在进行的活动以及在此时间段内所能完成的任务。线程有创建、可运行、运行中、阻塞和死亡5中状态。一个具有生命的线程,总是处于这5中状态中。

  • 新建状态:使用new创建一个线程后,该线程仅仅是一个空对象,系统没有分配资源,称该线程处于创建状态
  • 可运行状态:使用start()方法启动一个线程之后,系统为该线程分配了除CPU外的所需资源,是该线程处于可运行状态(Runnable)
  • 运行状态:Java运行系统通过调度选中了一个Runnable线程,使其占有CPU并转化为运行中(Running),此时,系统真正执行线程的run()方法
  • 阻塞状态:一个正在运行的线程因为某种原因不能继续进行,进入阻塞状态
  • 死亡状态:线程结束

4、线程的优先级

从概念上说,线程是并发运行的,但是从计算机的运行角度来说,确是串行执行的。当系统只有一个CPU时,线程会以某种顺序执行,这称为线程调度。

Java采用的是一种简单、固定的调度法,即固定优先级调度。这种算法是根据处于可运行状态线程的相对优先级来实行调度。当线程产生时,它继承原线程的优先级。在需要时可对优先级进行修改。如果两个线程具有相同的优先级,他们将被交替运行。

Java实时系统的线程调度算法还是强制性的,在任何时刻,如果一个比其他线程优先级都高的线程状态变为可执行状态,那么系统将选择高优先级线程来运行。

同一时刻如果有多个线程处于可运行状态,则他们需要排队等待CPU资源。此时每个线程自动按照获得线程的优先级,线程的优先级的高低反映线程的重要或仅仅成都。可运行状态的线程按照优先级排队,线程调度依据优先级基础上的“先到先服务”原则。

线程调度管理器负责线程排队和CPU在线程之间的分配,并由线程调度算法进行调度。当线程调度管理器选中某个线程时,该线程获得CPU资源而进入可运行状态。线程调度是先占式调度,即如果在当前线程执行过程中一个更高级的线程进入可运行状态,则这个线程立即被调度执行。先占式调服分为:独占式和分时占式。

独占式:当前执行线程将一直执行下去知道执行完毕或者某种原因主动放弃CPU,或者CPU被一个更高级的线程抢占。

分时占式:当前运行线程获得一个时间片,当时间到时,即使没有执行完也要让出CPU,进入可运行状态,等待下一个时间片的调度,系统选中其他可运行状态的线程执行。分时占式的系统使每个线程工作若干步,实现多线程同时运行。

二、线程的开发方法

线程所有的操作都发生在线程体中,在java中线程体是从Thread类继承的run方法或者实现Runnable接口的类中的run方法,当线程产生并初始化后,实时系统调用它的run方法。run方法内的代码实现线程的行为,它是线程的主要部分。

本小节将首先讲解Java程序中进行多进程调度的两种方法

使用Runtime类

使用ProcessBuilder类

然后再讲解在Java中实现一个线程的两种方法

实现Runnable接口实现它的run方法

继承Thread类,覆盖它的run方法

两种方式的区别,如果你已经继承了其他类,那么你只能选择实现Runnable接口了,因为java是单继承关系

1、使用继承调用java程序

有时我们为了系统稳定性的需要,我们在java 代码中启动多个Java子进程。我们可以使用两种方法来实现这种要求。最简单的就是通过Runtime和exec方法来执行Java类名。如果执行成功,则返回一个Process对象,如果执行失败,那么将抛出一个IOException错误。使用ProcessBuilder建立子进程,调用ProcessBuilder的start方法启动子进程,其余跟Runtime异常。

2、使用继承创建java线程

Thread是一个具体类,不是一个抽象类,它封装了线程的行为。

public class Thread extends Object implements Runable

线程是程序中的执行线程。Java虚拟机允许应用程序并发地运行多个执行线程。每个线程多有优先级,高优先级线程的执行优先。每个线程可以标记为一个守护线程。

例如:计算大于某一规定值的质数的线程

class PrimeThread extends Thread{
    long minPrime;
    PrimeThread(long minPrime){
        this.minPrime = minPrime;
    }
    public void run(){
        //compute primes larger than minPrime
    }
}
PrimeThread p = new PrimeThread(143);
p.start();

当使用继承创建线程时,可以用Thread的start方法来启动。

3、使用实现Runable接口创建Java线程

Runable接口类应该由哪些打算通过某一线程执行其实例

时间: 2024-10-14 09:25:56

Java 多线程 编程 教程的相关文章

Java 多线程 编程 教程 线程的运行与控制

在多个线程同时运行时,就存在多个线程之间的调度控制.资源分配等.本节就来讲解线程使用中的一系列控制命令和使用方法 线程的启动start().join()与停止stop() 线程的休眠sleep().挂起yield 线程的同步synchronized 线程的同步锁机制:wait().notify()和notifyAll() start()启动线程,当线程创建之后,利用start方法启动线程.此外还可以利用join方法让线程立即执行 sleep()让当前线程暂停一段时间之后继续执行.sleep()方

(接第一篇)Java 多线程 编程 教程

Runnable接口应该由那些打算通过某一线程执行其实例的类来实现.类必须定义一个名为run()的无参数方法.void run(). 此外,Runnable为非Thread子类提供了一种激活方式.通过实例化某个Thread实例并将自身作为运行目标,就可以运行实现Runnable的类而无须创建Thread的子类. 4.定时器TimerTask TimerTask是一种特殊的线程,用来为Timer安排一次执行或者重复执行的任务.他实现了Runable接口,是一个抽象类 public abstract

JAVA读书推荐----《深入分析Java Web技术内幕》--《java多线程编程核心技术》--《大型网站技术架构 核心原理与案例分析》-《Effective Java中文版》

(1)  首先推荐的不是一本书,而是一个博客,也是我们博客园另外一位博友java_my_life. 目前市面上讲解设计模式的书很多,虽然我前面讲了看书是最好的,但是对设计模式感兴趣的朋友们,我推荐的是这个博客.这位博友的设计模式讲得非常非常好,我认为90%的内容都是没有问题且很值得学习的,其讲解设计模式的大体路线是: 1.随便开篇点明该设计模式的定义 2.图文并茂讲解该设计模式中的结构 3.以详细的代码形式写一下该种设计模式的实现 4.补充内容 5.讲解该设计模式的优缺点 对于一个设计模式我们关

《Java多线程编程核心技术》推荐

写这篇博客主要是给猿友们推荐一本书<Java多线程编程核心技术>. 之所以要推荐它,主要因为这本书写得十分通俗易懂,以实例贯穿整本书,使得原本抽象的概念,理解起来不再抽象. 只要你有一点点Java基础,你就可以尝试去阅读它,相信定会收获甚大! 博主之前网上找了很久都没完整pdf电子版的,只有不全的试读版,这里博主提供免费.清晰.完整版供各位猿友下载: http://download.csdn.net/detail/u013142781/9452683 刚刚已经提到,<Java多线程编程核

Java多线程编程模式实战指南(二):Immutable Object模式--转载

本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-immutable-object.转载请注明作者: 黄文海 出处:http://viscent.iteye.com. 多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object模式使得我们可以在不使用锁的情况下,既保证共享变量访问的线程安

java多线程编程

一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般都更复杂.在多线程访问共享数据的时候,这部分代码需要特别的注意.线程之间的交互往往非常复杂.不正确的线程同步产生的错误非常难以被发现,并且重现以修复. 2)上下文切换的开销当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指

Java 多线程编程两个简单的例子

/** * @author gao */ package gao.org; public class RunnableDemo implements Runnable{ @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<10;i++){ System.out.println("新线程输出:"+i); } } public static void main(String []

Java多线程编程基础之线程对象

在进入java平台的线程对象之前,基于基础篇(一)的一些问题,我先插入两个基本概念. [线程的并发与并行] 在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent).而在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel). 在上面包括以后的所有论述中,请各位朋友谅解,我无法用最准确的词语来定义储

拨开云雾见天日 —— Java多线程编程概念剖析

说到Java多线程编程,大多数人都会想到继承Thread或实现Runnable编程,new 一个Thread实例,调用start()方法,由OS调用即可.具体过程如下: public class MyThread extends Thread {     @Override     public void run() {         System.out.println("MyThread");     }     public static void main(String[]