java线程池中以代码的顺序运行,主要是记录一下继承线程池的内容

1.这个是自定义的线程池类,直接上代码

package org.jimmy.threadtest20181121;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolExecutor201811281311 extends ThreadPoolExecutor {

    public static Runnable prevRunnable;

    public ThreadPoolExecutor201811281311(int corePoolSize,
            int maximumPoolSize, long keepAliveTime, TimeUnit unit,
            BlockingQueue<Runnable> workQueue) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
    }

    @Override
    protected void beforeExecute(Thread t, Runnable r) {
        if(prevRunnable != null){
            super.remove(prevRunnable);
        }
        super.beforeExecute(t, r);
    }

}

2.多线程操作的测试类,直接上代码

package org.jimmy.threadtest20181121;

import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.Semaphore;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class TestThread201811271616 {

    public static Semaphore semaphore = new Semaphore(1, true);
//    public static Semaphore semaphore = new Semaphore(1000, true);

    public static void main(String[] args) {
        try {
            long beginTime = new Date().getTime();
            TestThread201811271616 testThread201811271616 = new TestThread201811271616();
            LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();
            ThreadPoolExecutor201811281311 executor = new ThreadPoolExecutor201811281311(1, 10000, 3600, TimeUnit.SECONDS, workQueue);
            /*ExecutorService executorService = Executors.newSingleThreadExecutor();
            for(int i = 0 ; i < 30; i++) {
                String id = i + "";
                Thread thread = new Thread(testThread201811271616.new LineUpThread(id));
                executorService.submit(thread);
            }
            executorService.shutdown();*/
            for(int i = 0 ; i < 1000; i++) {
                String id = i + "";
                Runnable runnable = testThread201811271616.new LineUpThread(id);
                Runnable prevRunnable = null;
                if(i > 0){
                    String prevId = (i - 1) + "";
                    prevRunnable = testThread201811271616.new LineUpThread(prevId);
                    ThreadPoolExecutor201811281311.prevRunnable = prevRunnable;
                }
                executor.execute(runnable);
            }
            executor.shutdown();
            while(!executor.isTerminated()){
                Thread.sleep(1);
            }
            long endTime = new Date().getTime();
            System.out.println("一共耗时:" + (endTime - beginTime) + "毫秒!");
            /*semaphore.acquireUninterruptibly();
            System.out.println("工作人员吃饭了,暂停服务!");
            semaphore.release();*/
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    class LineUpThread implements Runnable {

        private String id;

        public LineUpThread(String id) {
            this.id = id;
        }

        @Override
        public void run() {
            synchronized(this) {
                try {
                    semaphore.acquireUninterruptibly();
//                    System.out.println("id:" + id);
                    System.out.println("轮到编号" + id + "的客户了,可以开始购票了!");
                    System.out.println("编号" + id + "的客户已购票成功!");
                    semaphore.release();
                } catch(Exception e) {
                    e.printStackTrace();
                }
            }
        }

    }

}

好了,我主要是记录给自己用的,有兴趣的自己看代码吧.

实际上,只要线程池只有一个容量,就一定是顺序执行的.与我代码中的删除无关.

原文地址:https://www.cnblogs.com/JimmySeraph/p/10031776.html

时间: 2024-10-29 13:00:31

java线程池中以代码的顺序运行,主要是记录一下继承线程池的内容的相关文章

Java和Android中,代码块、static静态代码块的执行顺序

Java和Android中,代码块.static静态代码块的执行顺序有没有什么区别呢. Java 先来个简单的例子 Main.java: public class Main { static int a = 1; static { System.out.println(a); } static { a = 2; } public static void main(String[] args) { System.out.println("Hello World!"); System.ou

Java对象创建阶段的代码调用顺序

在创建阶段系统通过下面的几个步骤来完成对象的创建过程 为对象分配存储空间 开始构造对象 从超类到子类对static成员进行初始化 超类成员变量按顺序初始化,递归调用超类的构造方法 子类成员变量按顺序初始化,子类构造方法调用 本文重点演示第三步到第五步: Grandpa类 1 package com.xinye.test; 2 3 public class Grandpa { 4 { 5 System.out.println("执行Grandpa的普通块"); 6 } 7 static

Java中四大代码块的运行顺序(附code)

验证证的方法是写code.例如以下: public class test { static class A { public static String name = "hello"; static { System.out.println("A static block1"); //1 } { System.out.println("A block3"); //3 } public A() { System.out.println("

在 Java 的多线程中,如何去判断给定的一个类是否是线程安全的(另外:synchronized 同步是否就一定能保证该类是线程安全的。)

同步代码块和同步方法的区别:同步代码块可以传入任意对象,同步方法中 如果多个线程检查的都是一个新的对象,不同的同步锁对不同的线程不具有排他性,不能实现线程同步的效果,这时候线程同步就失效了. 两者的区别主要体现在同步锁上面.对于实例的同步方法,因为只能使用this来作为同步锁,如果一个类中需要使用到多个锁,为了避免锁的冲突,必然需要使用不同的对象,这时候同步方法不能满足需求,只能使用同步代码块(同步代码块可以传入任意对象): 有几个原则的:程序次序规则:一个线程内,代码的执行会按照程序书写的顺序

JAVA线程池中队列与池大小的关系

JAVA线程中对于线程池(ThreadPoolExecutor)中队列,池大小,核心线程的关系写出自己的理解: 1:核心线程:简单来讲就是线程池中能否允许同时并发运行的线程的数量 2:线程池大小:线程池中最多能够容纳的线程的数量. 3:队列:对提交过来的任务的处理模式. 对于线程池与队列的交互有个原则: 如果队列发过来的任务,发现线程池中正在运行的线程的数量小于核心线程,则立即创建新的线程,无需进入队列等待.如果正在运行的线程等于或者大于核心线程,则必须参考提交的任务能否加入队列中去. 1:提交

java中静态代码块、构造代码块、构造方法、main函数的执行顺序?

静态代码块:在类被加载的时候就运行了,且只运行一次.static{} 构造代码块:在创建对象时被调用,每次创建对象都会调用一次.比静态代码块少了static.{} 构造方法:用于创建对象时定义初始化的状态.构造函数不能直接调用,必须通过new运算符在创建对象时才会自动调用,一般方法是在程序执行到它的时候被调用. 先不创建对象,如下: public class Test { // 静态代码块 static { System.out.println("静态代码块"); } // 构造代码块

Java线程并发中常见的锁--自旋锁 偏向锁

随着互联网的蓬勃发展,越来越多的互联网企业面临着用户量膨胀而带来的并发安全问题.本文着重介绍了在java并发中常见的几种锁机制. 1.偏向锁 偏向锁是JDK1.6提出来的一种锁优化的机制.其核心的思想是,如果程序没有竞争,则取消之前已经取得锁的线程同步操作.也就是说,若某一锁被线程获取后,便进入偏向模式,当线程再次请求这个锁时,就无需再进行相关的同步操作了,从而节约了操作时间,如果在此之间有其他的线程进行了锁请求,则锁退出偏向模式.在JVM中使用-XX:+UseBiasedLocking pac

通过实验研究“线程池中线程数目的变化规律” --- 下有不错的线程池使用 原理 总结

通过实验研究“线程池中线程数目的变化规律” 自从看了老赵关于线程池的实验以后,我就想学着做一个类似的实验,验证自己的理解,现在终于做好了,请大家指正. 一般情况下我们都使用Thread类创建线程,因为通过Thread对象可以对线程进行灵活的控制.但创建线程和销毁线程代价不菲,过多的线程会消耗掉大量的内存和CPU资源,假如某段时间内突然爆发了100个短小的线程,创建和销毁这些线程就会消耗很多时间,可能比线程本身运行的时间还长.为了改善这种状况,.NET提供了一种称之为线程池(Thread Pool

Java线程并发中常见的锁

随着互联网的蓬勃发展,越来越多的互联网企业面临着用户量膨胀而带来的并发安全问题.本文着重介绍了在java并发中常见的几种锁机制. 1.偏向锁 偏向锁是JDK1.6提出来的一种锁优化的机制.其核心的思想是,如果程序没有竞争,则取消之前已经取得锁的线程同步操作.也就是说,若某一锁被线程获取后,便进入偏向模式,当线程再次请求这个锁时,就无需再进行相关的同步操作了,从而节约了操作时间,如果在此之间有其他的线程进行了锁请求,则锁退出偏向模式.在JVM中使用-XX:+UseBiasedLocking pac