快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

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中的线程有四种状态分别是:运行、就绪、挂起、结束。假如一个线程结束了也就说明他是一个死线程了。当你调用一个线程实例的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
返回类别: 教程
上一教程: JDBC 入门(二)
下一教程: JSP开发入门(五)--JSP其他相关资源

您可以阅读与"JAVA基本教学:线程入门"相关的教程:
· Java 线程入门??线程的同步
· Java线程入门??什么是线程
· Java线程入门??定义线程中的 run 方式
· Java socket编程入门
· JAVA入门需把握的30个基本概念
    微笑服务 优质保证 索取样品