Java线程

Posted Calo-missile

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java线程相关的知识,希望对你有一定的参考价值。

1.   如何创建一个可以执行的线程类

       创建一个线程有两个办法:继承Thread类或者实现Runnable接口。

       首先:继承Thread

       这里一般只需要我们来重写run这个方法。下面是代码:

public class SimpleThread extends Thread {

       public SimpleThread() {

              start();

       }

       @Override

    public void run() {

              while (true) {

                     System.out.println(this);

                     // Imply other thread can run now, but we cannot assume that it will

                     // work well every time, actually , most of time we can get the same

                     // result, but not to a certainty.

                     // yield();

                     try {

                            sleep(100);

                     } catch (InterruptedException e) {

                            e.printStackTrace();

                     }

              }

       }

}

其次:实现Runnable接口,代码如下:

       Public class Inner implements Runnable {

              private Thread thread;

              public Inner(String name) {

                     thread = new Thread(this, name);

                     thread.start();

              }

              public void run() {

                     while (true) {

                     try {

                                   Thread.sleep(10);

                            } catch (InterruptedException e) {

                                   throw new RuntimeException(e);

                            }

                     }

              }

2.   几个常用的API

这边介绍几个常见而且重要的的线程API,这边JDK文档有更加详细的说明,其实JDK的文档就是个很好的学习资料,常备很重要哦!

方法

说明

start

使线程开始执行,实际上这个方法会调用下面的run这个方法,如果这个线程已经开始执行,则会扔出IllegalThreadStateException

sleep

是当前已经运行的线程休眠一段时间。如果当前线程已经被别的线程中断的话,将会扔出InterruptedException,而且interrupted标志也会被清空。这个方法有两个版本,具体参看JDK文档。

run

线程执行的业务逻辑应该在这里实现。

join

等待另外一个线程死亡。如果当前线程已经被别的线程中断的话,将会扔出InterruptedException,而且interrupted标志也会被清空。

yield

使当前线程临时的中断执行,来允许其他线程可以执行,因为Java的线程模型实际上映射到操作系统的线程模型,所以对于不同的操作系统,这个方法的就有不同的意义。对于非抢占式Operating System,这个方法使得其他线程得到运行的机会,但是对于抢占式的OS,这个方法没有太多的意义。关于这个方法,后边还有更多的介绍。

wait

Wait方法和后边的两个方法都来自Object。看过Java源码的可以知道,这三个方法都是Native方法,使比较直接的和操作系统打交道的方法。

这个方法的作用是让当前线程等待,直到被唤醒或者等待的时间结束。当前线程进入等待队列的时候,会放弃当前所有的资源,所以当前线程必须获得这些对象的Monitor,否则会扔出IllegalMonitorStateException关于wait方法的更多,后边会有介绍到。

notify

通知其他线程可以使用资源了。这个方法的使用要求很多,总之需要当前线程获得被调用的notify方法的对象的monitor。比如:

                                                 synchronized (person) {

                                                        person.notify();

                                                 }

其实,获得monitor的方法还有别的,这里简单介绍一下:

1.         执行这个对象的一个同步的方法

2.         执行这个对象的同步块

3.         执行一个同步的静态方法

notifyAll

除了通知所有的线程可以准备执行之外,跟上面的方法要求一样。但是只有一个线程会被选择然后执行,这个就跟优先级和其他状态有关系了。

interrupt

中断线程。

这边只是介绍了几个常用的API,但是非常重要,其他的API可以查看JDK的相关文档。

以上是关于Java线程的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程 2.线程安全

Java多线程 4.线程池

Java多线程 1.认识Java线程

java 子线程 回调 主线程

Java线程池

java 如何获得线程池中正在执行的线程数?