zoukankan      html  css  js  c++  java
  • JavaSE——多线程实现的两种方式

    Thread类:

    创建新执行线程有两种方法。

    一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例。例如,计算大于某一规定值的质数的线程可以写成:


         class PrimeThread extends Thread {
             long minPrime;
             PrimeThread(long minPrime) {
                 this.minPrime = minPrime;
             }
     
             public void run() {
                 // compute primes larger than minPrime
                  . . .
             }
         }
     

    然后,下列代码会创建并启动一个线程:

         PrimeThread p = new PrimeThread(143);
         p.start();
     

    另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。采用这种风格的同一个例子如下所示:

    注意:Runnable 为非 Thread 子类的类提供了一种激活方式。通过实例化某个 Thread 实例并将自身作为运行目标,就可以运行实现 Runnable 的类而无需创建 Thread 的子类。

    即  MyRunnable runnable = new MyRunnable();

         Thread t = new Thread(runnable);

     Runnable 接口:


         class PrimeRun implements Runnable {
             long minPrime;
             PrimeRun(long minPrime) {
                 this.minPrime = minPrime;
             }
     
             public void run() {
                 // compute primes larger than minPrime
                  . . .
             }
         }
     

    然后,下列代码会创建并启动一个线程:

    PrimeRun p = new PrimeRun(143);
         new Thread(p).start();

     注意线程的开始执行是用其实例对象去调用start()方法,开始执行后才会去调用该线程的run()方法。start()方法如被重写则无法启动线程。并且一个线程对象不可启动多个线程即不能去重复调用start()方法。

    一般进行多线程编程时会采用去实现Runnable接口而不是去继承Thead类,因为java是单根继承多实现。可以一次实现多个接口。

    并且Runnable可以实现资源共享。

    注意:在java平台运行多线程序时要启动任务务管理器,打开设置相关性,只选择一个cpu。

    在main方法中创建的线程叫做 main线程(主线程)。主线程运行结束,则整个程序运行结束。

    左边为主线程,当主线程运行到虚线处切换运行子线程(右箭头)。在同一cpu运行的多个线程来回切换要运行,提高资源的利用效率。

    线程的生命周期:

    new线程对象→新建

    调用start()就绪状态(Runnable)→方法调用栈、程序计时器→线程处于可运行池中

    调用run() 运行状态( Running )占用CPU→特殊情况 堵塞状态(暂时停止运行不占用cpu)

    执行结束、异常退出、线程的时间片用完后线程处于死亡状态

    堵塞状态的三种情况:

    位于对象等待池中的堵塞状态 wait()

    执行sleep()

    发出IO请求使线程受到阻塞。

    堵塞状态只能回到就绪状态,而不能回到运行状态。

    刚开始学不对的地方希望指正谢谢。

  • 相关阅读:
    2017秋-软件工程第三次作业(3)
    第二周例行总结
    2017秋-软件工程第二次作业
    2017秋-软件工程第一次作业
    ORA-01502: 索引或这类索引的分区处于不可用状态
    Merge into使用详解
    SQL2008中Merge的用法
    system表空间用满解决
    Oracle:ORA-00604: 递归 SQL 级别 1 出现错误
    AIX系统上压缩与解压文件
  • 原文地址:https://www.cnblogs.com/linlin0/p/6141363.html
Copyright © 2011-2022 走看看