Java线程入门教程 mingjava [原作]

原创 2004年08月12日 14:30:00
 

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

       有的时候你可能想写一个程序,每隔一段时间执行相关的任务,这个时候你可以使用Timer和TimerTask,非常方便。你可以参考http://blog.csdn.net/mingjava/archive/2004/07/04/33749.aspx

        在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


相关文章

我的速写新作

上次发的都是06年的画。。  这次来点新鲜的~~ 历史画册: http://blog.csdn.net/cuibo1123/archive/2008/11/27/3391174.aspx   1...
  • cuibo1123
  • cuibo1123
  • 2008-12-01 21:26:00
  • 1861

JAVA 经典入门教程

  • 2009年05月03日 16:11
  • 320KB
  • 下载

java线程java线程

  • 2011年07月21日 18:28
  • 1.78MB
  • 下载

清华java入门教程

  • 2008年10月30日 10:37
  • 5.45MB
  • 下载

java 7编程高级进阶代码

  • 2014年05月21日 16:07
  • 89KB
  • 下载

java 线程java 线程

  • 2010年11月23日 21:41
  • 19.58MB
  • 下载

Java线程详解大全

  • 2011年08月03日 23:00
  • 234KB
  • 下载

Java线程入门教程 详细

Java线程入门教程 收藏 线程是Java的内嵌特性,线程并不容易掌握,有专门介绍Java线程的书籍,读者可以参考。由此可见Java线程的重要性,本文将详细介绍线程的基本知识。         有的时...
  • langzhufeng
  • langzhufeng
  • 2010-12-24 15:03:00
  • 1029

Java线程入门教程 - zt

版权声明:CSDN是本Blog托管服务提供商。如本文牵涉版权问题,CSDN不承担相关责任,请版权拥有者直接与文章作者联系解决。         线程是Java的内嵌特性,线程并不容易掌握,有专门介绍J...
  • PerseusYan
  • PerseusYan
  • 2004-09-07 19:50:00
  • 802

Java基础入门教程

  • 2008年11月25日 18:52
  • 1.58MB
  • 下载
收藏助手
不良信息举报
您举报文章:Java线程入门教程 mingjava [原作]
举报原因:
原因补充:

(最多只允许输入30个字)