Java线程入门教程 - zt

转载 2004年09月07日 19:50:00
版权声明:CSDN是本Blog托管服务提供商。如本文牵涉版权问题,CSDN不承担相关责任,请版权拥有者直接与文章作者联系解决。
 
        线程是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);
        }
    }
}

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

[ZT]grub4dos初级教程-入门篇

From:http://hi.baidu.com/rabeta/blog/item/4814a81bd7d9d91c8618bff0.html0 为何写此初级教程? 假如你是第一次听说grub,...
  • u014461454
  • u014461454
  • 2014年03月31日 17:45
  • 2085

Java GUI入门教程

Java程序中开发GUI页面。下面我主要对Java中实现图像管理、图形绘制和颜色管理等做出介绍,与此同时,Swing包也做出一部分介绍。...
  • zhangyifei521
  • zhangyifei521
  • 2015年12月15日 09:50
  • 9486

HttpClient基础教程

1、HttpClient相关的重要资料: 官方网站:http://hc.apache.org/ API:http://hc.apache.org/httpcomponents-client-4.3.x...
  • jediael_lu
  • jediael_lu
  • 2014年05月18日 23:23
  • 13239

java入门教程-7.1Java线程的概念

和其他多数计算机语言不同,Java内置支持多线程编程(multithreaded programming)。 多线程程序包含两条或两条以上并发运行的部分。程序中每个这样的部分都叫一个线程(thr...
  • softn
  • softn
  • 2016年05月26日 05:50
  • 193

java入门教程-7.4Java创建线程(Runnable接口和Thread类)

大多数情况,通过实例化一个Thread对象来创建一个线程。Java定义了两种方式: 实现Runnable 接口;可以继承Thread类。 下面的两小节依次介绍了每一种方式。 实现Ru...
  • softn
  • softn
  • 2016年05月26日 05:54
  • 204

线程入门教程

  • 2013年12月16日 10:54
  • 20KB
  • 下载

android 线程入门教程

  • 2014年08月09日 19:05
  • 720KB
  • 下载

多线程入门教程三:线程间通信

线程之间通信的两个基本问题是互斥和同步。   线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。   ...
  • zhangSMILE123456
  • zhangSMILE123456
  • 2015年07月30日 10:14
  • 355

c# 线程入门教程,详解

一.多线程的概念  Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程。什么是进程呢?当一个程序开始运行时...
  • zhongheijituan
  • zhongheijituan
  • 2013年02月24日 20:46
  • 377

多线程入门教程二:线程控制

WIN32线程控制主要实现线程的创建、终止、挂起和恢复等操作,这些操作都依赖于WIN32提供的一组API和具体编译器的C运行时库函数。 1.线程函数   在启动一个线程之前,必须为线程编写一个全局的...
  • zhangSMILE123456
  • zhangSMILE123456
  • 2015年07月30日 09:55
  • 473
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java线程入门教程 - zt
举报原因:
原因补充:

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