zoukankan      html  css  js  c++  java
  • 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的相关文档。

  • 相关阅读:
    关于这个 blog
    P6499 [COCI2016-2017#2] Burza 题解
    CF1172F Nauuo and Bug 题解
    CF1479D Odd Mineral Resource 题解
    CF1442E Black, White and Grey Tree 题解
    CF1442D Sum 题解
    CF1025D Recovering BST 题解
    CF1056E Check Transcription 题解
    CF1025F Disjoint Triangles 题解
    红包算法的PHP实现
  • 原文地址:https://www.cnblogs.com/banzhuan/p/6635996.html
Copyright © 2011-2022 走看看