当前所在位置:珠峰网资料 >> 计算机 >> 计算机等级考试 >> 正文
2015年计算机二级Java多线程的概念学习教程
发布时间:2011/12/28 9:47:42 来源:城市学习网 编辑:ziteng

第七章 多线程

7.1 多线程的概念

  多线程编程的含义是可将程序任务分成几个并行的子任务。特别是在网络编程中,你会发现很多功能是可以并发执行的。比如网络传输速度较慢,用户输入速度较慢,你可以用两个独立的线程去完成这个功能,而不影响正常的显示或其他功能。多线程是与单线程比较而言的,普通的WINDOWS采用单线程程序结构,其工作原理是:主程序有一个消息循环,不断从消息队列中读入消息来决定下一步所要干的事情,一般是一个子函数,只有等这个子函数执行完返回后,主程序才能接收另外的消息来执行。比如子函数功能是在读一个网络数据,或读一个文件,只有等读完这数据或文件才能接收下一个消息。在执行这个子函数过程中你什么也不能干。但往往读网络数据和等待用户输入有很多时间处于等待状态,多线程利用这个特点将任务分成多个并发任务后,就可以解决这个问题。

  7.1.1 Java线程的模型

  Java的设计思想是建立在当前大多数操作系统都实现了线程调度。Java虚拟机的很多任务都依赖线程调度,而且所有的类库都是为多线程设计的。实时上,Java支持Macintosh和Ms-dos 的平台; 所以迟迟未出来就是因为这两个平台都不支持多线程。Java利用多线程实现了整个执行环境是异步的。

  在Java程序里没有主消息循环。 如果一个线程等待读取网络数据,它可以运行但不停 止系统的其他线程执行。用于处理用户输入的线程大多时间是等待用户敲键盘或击鼠标。还可以使动画的每一帧时间停顿一秒而并不使系统暂停。 一个线程启动后,它可以被挂起, 暂时不让它执行。 挂起的线程可以重新恢复执行。任何时间线程都可以被停止,被停止的线程就不能再重新启动。

  Java语言里,线程表现为线程类,线程类封装了所有需要的线程操作控制。必须很清晰 地区分开线程对象和运行线程,你可以将线程对象看作是运行线程的控制面板。在线程对象 里有很多函数来控制一个线程是否运行, 睡眠,挂起或停止。线程类是控制线程行为的唯一的手段。

  一个Java程序启动后,就已经有一个线程在运行。你可通过调用Thread.currentThread 函数来查看当前运行的是哪一个线程。当得到一个线程的控制柄,就可以作一个很有趣的事情,即使单线程也一样。下面这个例子让你知道怎样操纵当前线程。

  Filename:testthread

  public class testthread {

  public static void main(String[] args) {

  Thread t =Thread.currentThread(); //调用Thread.currentThread 函数

  t.setName("This Thread is running");

  System.out.println("The running thread:" + t);

  try {

  for (int i=0;i<5;i++) {

  System.out.println("Sleep time "+i);

  Thread.sleep(1000);

  }

  }

  catch (InterruptedException e) {

  System.out.println("thread has wrong");

  }

  }

  }

  执行结果:

  java testthread

  The running thread:Thread[This Thread is running,5,main]

  Sleep time 0

  Sleep time 1

  Sleep time 2

  Sleep time 3

  Sleep time 4  [NextPage]

  7.1.2 启动接口

  一个线程并不激动人心,多个线程才有实际意义。怎样创建更多的线程呢?我们需要创建线程类的另一个实例。当我们构造了线程类的一个新的实例,我们必须告诉它在新的线程里应执行哪一段程序。你可以在任意实现了启动接口的对象上启动一个线程。启动接口是一个抽象接口,来表示本对象有一个函数想异步执行。要实现启动接口,一个类只需要有一个叫run的函数。下面是创建一个新线程的例子:

  Filename:twothread.java

  public class twothread implements Runnable {

  public twothread() {

  Thread t1 =Thread.currentThread();

  t1.setName("The first main thread");

  System.out.println("The running thread:" + t1);

  Thread t2 = new Thread(this,"the second thread"); //创建了一个Thread对象

  System.out.println("creat another thread");

  t2.start();

  try {

  System.out.println("first thread will sleep");

  Thread.sleep(3000);

  }

  catch (InterruptedException e) {

  System.out.println("first thread has wrong");

  }

  System.out.println("first thread exit");

  }

  public void run() {

  try {

  for (int i=0;i<5;i++) {

  System.out.println("Sleep time for thread 2:"+i);

  Thread.sleep(1000);

  }

  }

  catch (InterruptedException e) {

  System.out.println("thread has wrong");

  }

  System.out.println("second thread exit");

  }

  public static void main(String[] args) {

  new twothread();

  }

  }

  执行结果:java twothread

  The running thread:Thread[The first main thread,5,main]

  creat another thread first thread will sleep

  Sleep time for thread 2:0

  Sleep time for thread 2:1

  Sleep time for thread 2:2

  first thread exit Sleep time for thread 2:3

  Sleep time for thread 2:4

  second thread exit

  main线程用new Thread(this, "the second thread")创建了一个Thread对象,通过传递第一个参 数来标明新线程来调用this对象的run函数。 然后我们调用start函数,它将使线程从run函数开始执行。

  7.1.3 同步

  因为多线程给提供了程序的异步执行的功能,所以在必要时必须还提出一种同步机制。 例如,想两个线程通讯并共享一个复杂的数据结构,你需要一种机制让他们相互牵制并正确执 行。 为这个目的,Java用一种叫监视器(monitor)的机制实现了进程间的异步执行。可以将监视器看作是一个很小的盒子,它只能容纳一个线程。一个线程进入一个监视器,所有其他 线程必须等到第一个线程退出监视器后才能进入。这个监视器可以设计成保护共享的数据不被多个线程同时操作。

  大多数多线程系统将这个监视器设计成对象,Java提出了一种更清晰的解决方案。没有Monitor类;每个对象通过将他们的成员函数定义成synchronized来定义自己的显式监视器,一个线程执行在一个synchronized函数里,其他任何线程都不能 调用同一个对象的synchronized函数。

  7.1.4 消息

  当程序被分成几个逻辑线程,你必须清晰的知道这些线程之间应怎样相互通讯。Java 提出了wait和notify等功能来使线程之间相互交谈。一个线程可以进入 某一个对象的synchronized 函数进入等待状态,直到其他线程显式地将它唤醒。可以有多个线程进入同一个函数并等待同一个唤醒消息。

广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved