`

Java教程_线程入门

阅读更多
线程是Java的内嵌特性,线程并不容易掌握,有专门介绍Java线程的书籍,读者可以参考。由此可见Java线程的重要性,本文将详细介绍线程的基本知识。

  有的时候你可能想写一个程序,每隔一段时间执行相关的任务,这个时候你可以使用Timer和TimerTask,非常方便。你可以参考这里。

  在Java中实现一个线程有两种方法,第一是实现Runnable接口实现它的run()方法,第二种是继承Thread类,覆盖它的run()方法。下面是代码示例:


  public class DoSomething implements Runnable {
  public void run(){
  // here is where you do something
  }
  }
  public class DoAnotherThing extends Thread {
  public void run(){
  // here is where you do something
  }
  }


  这两种方法的区别是,如果你的类已经继承了其它的类,那么你只能选择实现Runnable接口了,因为Java只允许单继承的。

   java中提供了哪些api以编写多线程程序

  这里只列出几个常用的方法和属性值。
  属性值,有三个MAX_PRIORITY,MIN_PRIORITY,NORM_PRIORITY

  方法:

Thread(); //建立一个线程
void run(); //对于一个继承了Runnable接口的class而言,
//他运行一个线程,否着他什么都不做
void setPriority(int newPriority); //设置优先级
void start(); //运行一个程序
void sleep(long millis); //线程睡眠millis毫秒
static void yield(); //临时pause一个程序以便起他线程运行



  Java中的线程有四种状态分别是:运行、就绪、挂起、结束。如果一个线程结束了也就说明他是一个死线程了。当你调用一个线程实例的start()的方法的时候,这个时候线程进入就绪状态,注意并不是运行状态,当虚拟机开始分配给他CPU的运行时间片的时候线程开始进入运行状态,当线程进入等待状态,例如等待某个事件发生的时候,这时候线程处于挂起状态。

  启动一个线程你只需要调用start()方法,针对两种实现线程的方法也有两种启动线程的方法,分别如下:


  DoSomething doIt = new DoSomething();
  Thread myThread = new Thread( doIt );
  myThread.start();
  DoAnotherThing doIt = new DoAnotherThing();
  doIt.start();



  由于安全等因素Thread中的stop()方法已经不推荐使用了,因此如果你想要停止一个线程的时候可以通过设置一个信号量,例如:


  public class MyThread implements Runnable {
  private boolean quit = false;
  public void run(){
  while( !quit ){
  // do something
  }
  }

  public void quit(){
  quit = true;
  }
  }


  如果每个线程只做它自己的事情,那么就很简单了,但是有的时候几个线程可能要同时访问一个对象并可能对它进行修改,这个时候你必须使用线程的同步在方法或者代码块使用关键字synchronized,例如:


  public class Counter {
  private int counter;
  public synchronized int increment(){
  return ++counter;
  }

  public synchronized int decrement(){
  if( --counter < 0 ){
  counter = 0;
  }

  return counter;
  }
  }



  每个java对象都可以最为一个监视器,当线程访问它的synchronized方法的时候,他只允许在一个时间只有一个线程对他访问,让其他得线程排队等候。这样就可以避免多线程对共享数据造成破坏。记住synchronized是会耗费系统资源降低程序执行效率的,因此一定要在需要同步的时候才使用,尤其在J2ME的开发中要小心。

  如果你要是想让线程等待某个事件的发生然后继续执行的话,那么这就涉及到线程的调度了。在java中通过wait(),notify(),notifyAll()来实现,这三个方法是在Object类中定义的,当你想让线程挂起的时候调用obj.wait()方法,在同样的obj上调用notify()则让线程重新开始运行。 最后以SUN提供的Producer/Consumer的例子来结束这篇文章,内容是Producer产生一个数字而Consumer消费这个数字,这个小程序里面基本覆盖了本文所有的知识点。请详细研究一下代码


  public class Producer extends Thread {
  private CubbyHole cubbyhole;
  private int number;
  public Producer(CubbyHole c, int number) {
  cubbyhole = c;
  this.number = number;
  }

  public void run() {
  for (int i = 0; i < 10; i++) {
  cubbyhole.put(i);
  System.out.println("Producer #" + this.number
  + " put: " + i);
  try {
  sleep((int)(Math.random() * 100));
  } catch (InterruptedException e) { }
  }
  }
  }


  public class CubbyHole {
  private int contents;
  private boolean available = false;

  public synchronized int get() {
  while (available == false) {
  try {
  wait();
  } catch (InterruptedException e) { }
  }
  available = false;
  notifyAll();
  return contents;
  }

  public synchronized void put(int value) {
  while (available == true) {
  try {
  wait();
  } catch (InterruptedException e) { }
  }
  contents = value;
  available = true;
  notifyAll();
  }
  }

  public class Consumer extends Thread {
  private CubbyHole cubbyhole;
  private int number;

  public Consumer(CubbyHole c, int number) {
  cubbyhole = c;
  this.number = number;
  }

  public void run() {
  int value = 0;
  for (int i = 0; i < 10; i++) {
  value = cubbyhole.get();
  System.out.println("Consumer #" + this.number
  + " got: " + value);
  }
  }
  }
  public class ProducerConsumerTest {
  public static void main(String[] args) {
  CubbyHole c = new CubbyHole();
  Producer p1 = new Producer(c, 1);
  Consumer c1 = new Consumer(c, 1);

  p1.start();
  c1.start();
  }
  }

  SUN说输出的结果应该是如下形式,但是在我的机器上却不是这样的,做了一些改动才正确,有兴趣的朋友可以运行一下看看结果,欢迎和我讨论一下!


  Producer #1 put: 0
  Consumer #1 got: 0
  Producer #1 put: 1
  Consumer #1 got: 1
  Producer #1 put: 2
  Consumer #1 got: 2
  Producer #1 put: 3
  Consumer #1 got: 3
  Producer #1 put: 4
  Consumer #1 got: 4
  Producer #1 put: 5
  Consumer #1 got: 5
  Producer #1 put: 6
  Consumer #1 got: 6
  Producer #1 put: 7
  Consumer #1 got: 7
  Producer #1 put: 8
  Consumer #1 got: 8
  Producer #1 put: 9
  Consumer #1 got: 9

分享到:
评论

相关推荐

    《java入门经典教程》.rar_JAVA 教程_java 入门_java 教程_java入门

    本教程《Java入门经典教程》是专为初学者设计的,旨在帮助新接触编程或者对Java不熟悉的朋友们快速掌握这门语言的基础知识。 首先,Java教程通常会从基础语法开始,包括变量、数据类型、运算符以及流程控制语句(如...

    java入门经典教程.zip_java 教程_java 鏁欑▼_java入门_zip_教程 java

    最后,Java入门经典教程中还可能涵盖了IO流、线程、网络编程、Swing或JavaFX图形用户界面开发等内容。IO流允许程序进行数据输入和输出,线程则实现了程序的并发执行,提高了系统的响应速度。而Swing和JavaFX是Java...

    dq.zip_java 入门_java入门

    "dq.zip_java 入门_java入门"这个压缩包文件显然旨在为初学者提供Java编程的基础知识。 "JAVA学习入门"通常会涵盖以下几个关键部分: 1. **Java语言基础**:这包括基本的数据类型(如整型、浮点型、字符型和布尔型...

    java基础知识入门_java_world_入门_

    本文将深入探讨Java的基础知识,帮助初学者快速入门。 首先,Java是一种面向对象的语言,它的设计理念是“一次编写,到处运行”(Write Once, Run Anywhere,简称WORA)。这意味着用Java编写的代码可以在任何支持...

    java线程入门级书籍

    ### Java线程入门知识点详解 #### 一、Java线程基础知识概述 **1.1 什么是线程?** 线程是程序执行流的最小单元,是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。在Java中...

    Android_Code.rar_Android教程_android_android 入门_android 源码_java 教程

    3. **Java教程**: Java是Android应用开发的基础,因此对Java语法的熟悉至关重要。这包括类、对象、继承、接口、异常处理、集合框架、多线程等概念。同时,理解Java面向对象编程的原则也是必不可少的。 4. **Android...

    java基础知识入门_java_world_入门_源码.zip

    这份"java基础知识入门_java_world_入门_源码.zip"压缩包显然旨在帮助初学者掌握Java编程的基础概念。源码通常包含一系列的Java程序示例,这些示例能够帮助学习者理解并实践Java语法和编程原则。 在Java基础知识...

    java线程入门,java线程入门

    以下是对Java线程入门的详细讲解: 1. **线程的基本概念**: - 线程是操作系统分配CPU时间的基本单元,一个进程可以包含一个或多个线程。 - 在Java中,每个应用程序至少有一个主线程,它负责启动和控制其他线程。...

    Java快速入门教程资料_Java快速入门教程资料_JAVA教程资料_most5st_源码

    这个"Java快速入门教程资料"集合提供了全面的学习资源,适合初学者系统地了解和掌握Java编程基础。下面将按照标签和压缩包中的文件名称,详细解析其中可能包含的知识点。 1. **Java基本语法** - `day01资料`:通常...

    JAVA多线程入门教程

    本文将从进程、线程的基本概念、Java中的多线程支持以及如何创建和控制线程等方面,为你提供一个入门级别的教程。 1. 进程与线程: - **程序**是静态的代码集合,而**进程**是程序的一次动态执行过程,它是操作...

    Java入门笔记6_线程

    在Java编程中,线程是程序执行的最小单元,它允许一个程序同时执行多个任务。在Java中,有两种主要的方式来创建和管理线程:通过继承`Thread`类和实现`Runnable`接口。 1. **继承Thread类创建线程** 当一个类直接...

    java_多线程设计模式

    java_多线程设计模式,一部挺适合新手了解并且使用java多线程的入门教程

    java_lianliankan_java.rar_Java游戏_游戏编程入门

    《Java连连看游戏程序:入门到精通》 Java编程语言在游戏开发领域有着广泛的应用,尤其对于初学者来说,通过实际的项目练习可以快速掌握编程基础和游戏逻辑。本资源"java_lianliankan_java.rar"就是一个绝佳的实例...

    Java期末复习资料_第1章_Java入门_.pdf

    4. 多线程:Java提供了内置的多线程支持,允许程序同时执行多个线程,进行多任务处理。 5. 动态性:Java支持动态加载类和运行时类型信息,可以在运行时发现和加载新的类库。 Java的开发步骤具体包括: 1. 编写...

    动力节点_Java基础视频教程212_线程-线程休眠

    动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常细腻,由浅入深。适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础...

    动力节点_Java基础视频教程216_线程-线程让步

    动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常细腻,由浅入深。适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础...

    动力节点_Java基础视频教程211_线程-线程优先级

    动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常细腻,由浅入深。适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础...

    动力节点_Java基础视频教程215_线程-线程中断

    动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常细腻,由浅入深。适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础...

    Java_Servlet入门教程

    以上就是关于Java Servlet入门教程的相关知识点,从基础的Servlet工作原理到高级的应用场景,都进行了详细的说明。通过这些知识点的学习,相信可以帮助开发者有效地利用Servlet技术开发出功能强大、效率高的Web应用...

    动力节点_Java基础视频教程218_线程-守护线程

    动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常细腻,由浅入深。适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础...

Global site tag (gtag.js) - Google Analytics