java 中 ScheduledExecutorService 创建的多线程和 runnable

问题描述

java 中 ScheduledExecutorService 创建的多线程和 runnable

今天用到用ScheduledExecutorService 做定时任务,发现里面可以做多线程的操作。使用起来也很方便。
直接new 个实例就可以了。
ScheduledExecutorService executor = Executors
.newScheduledThreadPool(10);
for (int i = 0; i < 10; i++) {
executor.scheduleAtFixedRate(new pop(), 0, 500,
TimeUnit.MILLISECONDS);
}
在for循环一个方法就可以了。

和以前使用runnable相比来说,结构简单点,并且使用也很方便。
想了解下scheduledExecutorService 和runnable 这两个之间的区别。和他们之间的差异、和使用场景

解决方案

Rrunnable是线程类需要实现的接口,scheduledExecutorService是管理一堆线程对象的可选工具。
不使用scheduledExecutorService的话,一些线程控制操作需要自己完成,一个线程还好说,多个线程并行的情况就比较麻烦。
多线程控制操作比如:
(1)等待或判断所有线程执行完
(2)立刻中断所有线程
(3)线程队列实现,通过设定,可以限制同时(并行)执行的任务数,多余的任务等待执行。
例子:有7个任务,限定并行数为3
只有3个任务能同时执行,剩余任务等待执行,3个并行任务中1个执行完毕时,立刻从等待任务中取一个去执行,直到所有任务执行完。
这个过程中,所有时间点上有且仅有3个任务在运行,保证效率的同时,也很好控制了内存使用。

ps:Java中,实现线程类的接口和类有三个:Runnable(接口),Callable(接口),Thread(类)

解决方案二:

java 多线程(Thread,Runnable)
java多线程 Thread 和Runnable
Java多线程-(4)线程的创建、启动、Runnable和Thread

解决方案三:

对于这个问题你可以看下作者的JUC想关的文档,应该对已会有非常大的帮助!!

http://ifeve.com/doug-lea/

时间: 2024-10-31 06:59:23

java 中 ScheduledExecutorService 创建的多线程和 runnable的相关文章

JAVA中对象创建和初始化过程

分析一下JAVA中对象创建和初始化过程中涉及的相关概念问题,java中栈(stack)与堆(heap),对象.引用.句柄的概念. 1.Java中的数据类型 Java中有3个数据类型: 基本数据类型(在Java中,boolean.byte.short.int.long.char.float.double这八种是基本数据类型) 引用类型 null类型 其中,引用类型包括类类型(含数组).接口类型. 下列语句声明了一些变量: 以下是引用片段: int k ; A a; //a是A数据类型的对象变量名.

java中不能创建fileoutptstream 类型的对象

问题描述 java中不能创建fileoutptstream 类型的对象 import java.io.*; public class FileOutputStream { public static void main(String[] args) { //定义一个FileOutputStream 类型的变量 FileOutputStream fo = null; try{ //利用绝对路径创建一个FileOutputStream类型的对象 fo = new FileOutputStream (

赋值-java中如何创建一个对象的副本

问题描述 java中如何创建一个对象的副本 java中基本类型赋值是传递的是值,也就是创建了一个副本,而对象赋值时传递的是引用,那么java中对象能不能创建副本?如何创建 解决方案 需要你自己实现一个clone方法,然后new一个对象,再依次复制每个字段.你可以用反射或者序列化再反序列化的方法简化复制对象的编程. 解决方案二: http://www.cnblogs.com/yxnchinahlj/archive/2010/09/20/1831615.html 解决方案三: 你可以赋值给一个新对象

java 中如何创建hashmap 的代理对象,或者,怎么观察hashmap的改变的前后状态

问题描述 现在有个需求,需要创建可以监听值变化的map,在值变化的前后实现相应的逻辑操作,我首先想到的是代理模式,可是getClassLoader不成功,网上查询的结果貌似map是有java引导加载器加载的,后来想要做监听,但是没有好的思路,希望能得到相关大牛的指引~ 解决方案 解决方案二:定义一个继承map的类,然后在就改值的方法前后增加触发事件,回调相应的监听方法.解决方案三:嗯...继续map,重新put,remove方法,那样你爱干嘛都行解决方案四:引用1楼stonefeng的回复: 定

Java Web项目中使用Socket通信多线程、长连接的方法_java

很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听.我们的应用场景是在java项目中,需要外接如一个硬件设备,通过tcp通信,获取设备传上来的数据,并对数据做回应. 先看一下web的监听代码: import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class

举例讲解Java中的多线程编程_java

Java创建线程(Runnable接口和Thread类) 大多数情况,通过实例化一个Thread对象来创建一个线程.Java定义了两种方式: 实现Runnable 接口: 可以继承Thread类. 下面的依次介绍了每一种方式.实现Runnable接口 创建线程的最简单的方法就是创建一个实现Runnable 接口的类.Runnable抽象了一个执行代码单元.你可以通过实现Runnable接口的方法创建每一个对象的线程.为实现Runnable 接口,一个类仅需实现一个run()的简单方法,该方法声明

Java基础-创建Java程序中的线程池

程序|创建 线程是Java的一大特性,它可以是给定的指令序列.给定的方法中定义的变量或者一些共享数据(类一级的变量).在Java中每个线程有自己的堆栈和程序计数器(PC),其中堆栈是用来跟踪线程的上下文(上下文是当线程执行到某处时,当前的局部变量的值),而程序计数器则用来跟踪当前线程正在执行的指令. 在通常情况下,一个线程不能访问另外一个线程的堆栈变量,而且这个线程必须处于如下状态之一: 1.排队状态(Ready),在用户创建了一个线程以后,这个线程不会立即运行.当线程中的方法start()被调

浅谈java中异步多线程超时导致的服务异常_java

在项目中为了提高大并发量时的性能稳定性,经常会使用到线程池来做多线程异步操作,多线程有2种,一种是实现runnable接口,这种没有返回值,一种是实现Callable接口,这种有返回值. 当其中一个线程超时的时候,理论上应该不 影响其他线程的执行结果,但是在项目中出现的问题表明一个线程阻塞,其他线程返回的接口都为空.其实是个很简单的问题,但是由于第一次碰到,还是想了一些时间的.很简单,就是因为阻塞的那个线 程没有释放,并发量一大,线程池数量就满了,所以其他线程都处于等待状态. 附上一段自己写的调

锁-JAVA中多线程读取成员变量的重复问题

问题描述 JAVA中多线程读取成员变量的重复问题 这是个模拟卖票的问题,使用一个对象实现Runnable接口建立四个线程,这个对象有100张票,四个进程同时卖,因为没使用锁,所以会出现负数票,但是为什么会出现相同的票呢?8号票卖了四次,是因为成员变量在if之后进栈保存了值?然后直接用这个num输出吗? 代码: class Ticket implements Runnable//extends Thread { private int num = 100 public void run()//这时