当前位置:首页 > 编程教程 > java技术文章 > Java实现指定线程执行顺序的三种方式示例

理解Java指定线程执行顺序(三种方式)

  • 发布时间:
  • 作者:码农之家
  • 点击:119

这篇文章主要知识点是关于Java、指定线程、执行顺序、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Java编程实战宝典
Java编程实战宝典完整超清版
  • 类型:Java大小:154.4 MB格式:PDF作者:刘新
立即下载

Java实现指定线程执行顺序的三种方式示例

本文实例讲述了Java实现指定线程执行顺序的三种方式。分享给大家供大家参考,具体如下:

方法一:通过共享对象锁加上可见变量来实现。

public class MyService {
  private volatile int orderNum = 1;
  public synchronized void methodA() {
    try {
      while (orderNum != 1) {
        wait();
      }
      for (int i = 0; i < 2; i++) {
        System.out.println("AAAAA");
      }
      orderNum = 2;
      notifyAll();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
  public synchronized void methodB() {
    try {
      while (orderNum != 2) {
        wait();
      }
      for (int i = 0; i < 2; i++) {
        System.out.println("BBBBB");
      }
      orderNum = 3;
      notifyAll();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
  public synchronized void methodC() {
    try {
      while (orderNum != 3) {
        wait();
      }
      for (int i = 0; i < 2; i++) {
        System.out.println("CCCCC");
      }
      orderNum = 1;
      notifyAll();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}

import service.MyService;
public class ThreadAA extends Thread {
  private MyService dbtools;
  public ThreadAA(MyService dbtools) {
    super();
    this.dbtools = dbtools;
  }
  @Override
  public void run() {
    dbtools.methodA();
  }
}

import service.MyService;
public class ThreadBB extends Thread {
  private MyService dbtools;
  public ThreadBB(MyService dbtools) {
    super();
    this.dbtools = dbtools;
  }
  @Override
  public void run() {
    dbtools.methodB();
  }
}

import service.MyService;
public class ThreadCC extends Thread {
  private MyService dbtools;
  public ThreadCC(MyService dbtools) {
    this.dbtools = dbtools;
  }
  @Override
  public void run() {
    dbtools.methodC();
  }
}

import extthread.ThreadCC;
import service.MyService;
import extthread.ThreadAA;
import extthread.ThreadBB;
public class Run {
  public static void main(String[] args) {
    MyService myService = new MyService();
    for (int i = 0; i < 2; i++) {
      ThreadBB output = new ThreadBB(myService);
      output.start();
      ThreadAA input = new ThreadAA(myService);
      input.start();
      ThreadCC threadCC = new ThreadCC(myService);
      threadCC.start();
    }
  }
}

执行结果:

Java实现指定线程执行顺序的三种方式示例

可以看到线程的启动按顺序执行了。共享对象锁,可以保证每个方法只能同时有一个线程进入,配合wait和notifyall方法,可以启动或者唤醒线程。

方法二:通过主线程Join()

class T11 extends Thread {
  public void run() {
    System.out.println("in T1");
  }
}
class T22 extends Thread {
  public void run() {
    System.out.println("in T2");
  }
}
class T33 extends Thread {
  public void run() {
    System.out.println("in T3");
  }
}
public class Test2 {
  public static void main(String[] args) throws InterruptedException {
    T11 t1 = new T11();
    T22 t2 = new T22();
    T33 t3 = new T33();
    t1.start();
    t1.join();
    t2.start();
    t2.join();
    t3.start();
  }
}

方法三:通过线程执行时Join()

class T1 extends Thread {
  public void run(){
    Random random = new Random();
    try {
      Thread.sleep(random.nextInt(1000));
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println("in T1");
  }
}
class T2 extends Thread{
  private Thread thread;
  public T2(Thread thread) {
    this.thread = thread;
  }
  public void run(){
    try {
      thread.join();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println("in T2");
  }
}
class T3 extends Thread{
  private Thread thread;
  public T3(Thread thread) {
    this.thread = thread;
  }
  public void run(){
    try {
      thread.join();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println("in T3");
  }
}
public class Test {
  public static void main(String[] args) throws InterruptedException {
    T1 t1 = new T1();
    T2 t2 = new T2(t1);
    T3 t3 = new T3(t2);
    t2.start();
    t1.start();
    t3.start();
  }
}

更多java相关内容感兴趣的读者可查看本站专题:《Java进程与线程操作技巧总结》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

Java 相关电子书
学习笔记
网友NO.397144

关于Java中try finally return语句的执行顺序浅析

问题分析 finally语句块一定会执行吗? 可能很多人第一反应是肯定要执行的,但仔细一想,如果一定会执行的话 也就不会这么SB的问了。 Demo1 public class Test { public static void main(String[] args) { System.out.println("return value of test(): " + test()); } public static int test() { int i = 1; // if (i == 1) { // return 0; // } System.out.println("the previous statement of try block"); i = i / 0; try { System.out.println("try block"); return i; } finally { System.out.println("finally block"); } }} Demo1的执行结果如下: the previous statement of try blockException in thread "main" java.lang.ArithmeticException: / by zero at com.becoda.bkms.bus.basics.web.Test2.test(Test2.java:15) at com.becoda.bkms.bus.basics.web.Test2.main(Test2.java:5) 另外,如果去掉上例中的注释,执行结果则是: return value of test(): 0 以上两种情况,finally语句块都没有执行,说明什么问题?只有与finally相对应的t……

网友NO.437179

浅谈Java文件执行顺序、main程序入口的理解

在我们通过JVM编译Java后缀名的文件时,JVM首先寻找入口(main方法) public static void main(String[] args) 1、由于在入口时,未调用任何对象,该方法只能设置为static静态 2、JVM为Java的最底层,所以即使有返回结果,结果也无处可去,因此该方法必然是void无返回值 3、由于main方法是入口,被JVM自动调用,只有将该方法设置为public公有级别才能对JVM可见 综上,入口main方法只能写为 public static void main(String[] args) 在我们没有写main方法时,系统会自动会为我们添加一个无参mian主方法,该方法的添加位置为public类中首行(之前也提到过,只有添加在public级别中才对JVM可见,可以自动调用) 注意:如果在java文件中未包含任一公共类(public class),此文件依然可以通过编译,但是主动运行由于找不到public class,就无法自动添加main方法,JVM找不到程序入口,运行会报错……

网友NO.253966

实例详解JavaScript中setTimeout函数的执行顺序

前言 setTimeout,前端工程师必定会打交道的一个函数。它看上去非常的简单,朴实,有着一个很不平凡的名字--定时器。其实网上关于JavaScript中setTimeout的文章很多,但总感觉例子不够直接具体,因此写了个简单的例子并加以解释希望能让大家明白setTimeout是如何执行的。下面话不多说了,来一起看看详细的介绍: 实例代码如下: var time1=new Date().getTime(); console.log(1,time1); setTimeout(function(){ var time4=new Date().getTime(); console.log(4,time4); for(var a=0;a10000000000;a++){ a=a+1; } var time2=new Date().getTime(); console.log(2,time2); },2000); setTimeout(function(){ var time3=new Date().getTime(); console.log(3,time3); },1000); setTimeout(function(){ var time5=new Date().getTime(); console.log(5,time5); },3000); setTimeout(function(){ var time6=new Date().getTime(); console.log(6,time6); },14000); 代码十分简单,想必大家都能看懂,执行结果如下: 解释……

<
1
>

Copyright 2018-2020 www.xz577.com 码农之家

版权投诉 / 书籍推广 / 赞助:520161757@qq.com