java多线程那些事之中的一个

1.  Callable 接口

获取线程运行状态(get、get(long timeout)),取消线程(cancel(boolean  mayinterruptifrunning))。isCancel,isDone等。

1.  实现callable 接口,

2.  创建线程池。submit thread

例如以下所看到的:

 Future< ? > processFuture = submitTask(
            new ProcessPbxPhoneThread(queue, phoneHandler, runningLock, runningFlagMap));
 private class ProcessPbxPhoneThread implements Callable<Boolean>
   {
      private BlockingQueue<PbxPhone> queue;
      private IPbxNotificationHandler<PbxPhone> phoneHandler;
      private ReadWriteLock runningLock;
      private Map<String, Boolean> runningFlagMap;
      private int processedPhoneCount = 0;
      private long currentTime;

      public ProcessPbxPhoneThread(BlockingQueue<PbxPhone> queue,
            IPbxNotificationHandler<PbxPhone> phoneHandler, ReadWriteLock runningLock,
            Map<String, Boolean> runningFlagMap)
      {
         this.queue = queue;
         this.phoneHandler = phoneHandler;
         this.runningFlagMap = runningFlagMap;
         this.runningLock = runningLock;
      }

      @Override
      public Boolean call()
         throws Exception
      {
         while (true)
         {
            PbxPhone phone = queue.take();
            if (processedPhoneCount % 100 == 0)
            {
               long now = System.currentTimeMillis();
               if (currentTime != 0)
               {
                  double speed = processedPhoneCount * 1000.0 * 60 / (now - currentTime);
                  log.debug("ProcessPbxPhoneThread phone process speed:{}*m", speed);
               }
               currentTime = now;
               processedPhoneCount = 0;
            }
            processedPhoneCount++;

            if (null != phone.getLines())
            {
               currentTime("invokePhoneHander");
               PbxNotification<PbxPhone> notification = new PbxNotification<PbxPhone>(
                     phoneHandler.getNotificationType(), NotificationOperation.INSERT,
                     phone.getUuid().toString(), phone);
               if (!phoneHandler.objectChanged(notification))
               {
                  logSpentTime("invokePhoneHander");
                  try
                  {
                     runningLock.writeLock().lock();
                     runningFlagMap.put("runningFlag", false);
                     break;
                  }
                  finally
                  {
                     runningLock.writeLock().unlock();
                  }
               }
               else
               {
                  logSpentTime("invokePhoneHander");
               }
            }
            else
            {
               break;
            }
         }
         return true;
      }
   }

submitTask 利用封装好的线程池提交线程:

 protected Future< ? > submitTask(Callable< ? > task)
   {
      return this.cucmDriverFactory.<strong style="background-color: rgb(255, 0, 0);">getExecutorService</strong>().submit(task);
   }

线程池创建例如以下代码:

  @Override
   public void initialize()
   {
      executorService = Executors.newCachedThreadPool(new DefaultThreadFactory("CucmDriverFactor-"));
   } 
@Override
   public ExecutorService getExecutorService()
   {
      if (executorService.isShutdown() || executorService.isTerminated())
      {
         initialize();
      }
      return this.executorService;
   }

ThreadFactory 创建例如以下:

 /**
* The thread factory, with name Prefix. Copied from ThreadPoolExecutor.DefaultThreadFactory
*/
public static class DefaultThreadFactory implements ThreadFactory {
private final ThreadGroup group;
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;

public DefaultThreadFactory(String namePrefix) {
SecurityManager s =

时间: 2024-10-18 10:23:03

java多线程那些事之中的一个的相关文章

Java多线程学习中遇到的一个有趣的问题

今天随便写了一个线程之间相互调度的程序,代码如下: class First extends Thread { public First() { start(); } synchronized public void run() { try { wait(); } catch(InterruptedException e) { e.printStackTrace(); } try { sleep(2000); } catch(InterruptedException e) { e.printSta

java多线程中死锁情况的一个示例

下面是死锁情况的一个示例代码 package com.qust.demo.money; class A { public synchronized void foo(B b) { System.out.println(Thread.currentThread().getName() + " 进入A的foo"); try { Thread.sleep(200); } catch (InterruptedException ex) { ex.printStackTrace(); } Sys

java多线程问题中死锁的一个实现

1.直接上代码: class LockDemo{ public static final Object A_LOCK=new Object(); public static final Object B_LOCK=new Object(); } public class ThreadLockDemo implements Runnable{ public boolean flag; public ThreadLockDemo(boolean flag) { this.flag=flag; } p

Java多线程的同步机制(synchronized)

一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在 java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个线程)就只能等了(线程阻塞在锁池 等待队列中). 取到锁后,他就开始执行同步代码(被synchronized修饰的代码):线程执行完同步代码后马上就把锁还给同步对象,其他在锁池中 等待的某个线程就可以拿到锁执行同步代码了.这样就保证了同步代码在统一时刻只有一个线程在执行. 众所周知,在Java多线程

Java多线程导致的的一个事物性问题

业务场景 我们现在有一个类似于文件上传的功能,各个子站点接受业务,业务上传文件,各个子站点的文件需要提交到总站点保存,文件是按批次提交到总站点的,也就是说,一个批次下面约有几百个文件. 考虑到白天提交这么多文件会影响到子站点其他系统带宽,我们将分站点的文件提交到总站点这个操作过程独立出来,放到晚上来做,具体时间是晚上7:00到早上7:00. 这个操作过程我们暂且称作"排程". 排程在运行之后,先获取所有需要上传到总站点的批次信息,拿到批次信息之后,将这个批次表的状态置为正在同步数据,这

java多线程编程--如何开始一个线程

如何开始一个线程 1. java多线程的实现方式 1.1 继承Thread类 定义类如下: public SubThread extends Thread { @override public void run() { ... } } 使用时: Thread subThread = new SubThread(); subThread.start(); 可以使用Thread类已有的函数进行操作. 1.2 实现Runnable接口 定义类如下: public SubThread implement

关于JAVA多线程的那些事__初心者

前言 其实事情的经过也许会复杂了点,这事还得从两个月前开始说.那天,我果断不干IT支援.那天,我立志要做一个真正的程序猿.那天,我26岁11个月.那天,我开始看Android.那天,我一边叨念着有朋自远方来,一边投身了JAVA的怀抱.那天,一切将会改变. 好吧,反正总的来说就是时隔4年半,我又开始搞JAVA了.Eclipse还是Eclipse:NetBeans还是NetBeans:Java被收之后已经来到了7,现在是8:在入手了几本JAVA的书籍后发现<JAVA编程思想>还是这么伟大:开始了新

java多线程下如何调用一个共同的内存单元(调用同一个对象)

1 /* 2 * 关于线程下共享相同的内存单元(包括代码与数据) 3 * ,并利用这些共享单元来实现数据交换,实时通信与必要的同步操作. 4 * 对于Thread(Runnable target)构造方法创建的线程,轮到它来享用CPU资源时. 5 * 目标对象就会自动调用接口中的run()方法 6 * */ 7 8 /* ----------------举例子------------------- */ 9 10 /* 11 * 使用Thread类创建两个模拟猫和狗的线程,猫和狗共享房屋中的一桶

实战Java虚拟机之中的一个“堆溢出处理”

从今天開始.我会发5个关于java虚拟机的小系列: 实战Java虚拟机之中的一个"堆溢出处理" 实战Java虚拟机之二"虚拟机的工作模式" 实战Java虚拟机之三"G1的新生代GC" 实战Java虚拟机之四"禁用System.gc()" 实战Java虚拟机之五"开启JIT编译" 以下说说[实战Java虚拟机之中的一个"堆溢出处理"] 在Java程序的执行过程中,假设堆空间不足.则有可能抛