• 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的相关文档。

  • 相关阅读:
    本周总结
    本周总结
    第四周自我总结
    结对编程
    第四周自我总结
    第三周自我总结
    本周工作安排及内容
    知识思考
    交作业。。。
    MSF过程模型
  • 原文地址:https://www.cnblogs.com/banzhuan/p/6635996.html
Copyright © 2020-2023  润新知