开启Thread线程只执行一次
代码如下
private static Thread mTaskThread = new Thread(new Runnable() {@Overridepublic void run() {count++;System.out.println("this is time do task:" + count);}
});public static void main(String[] args) {for (int i = 0; i < 10; i++) {mTaskThread.start();}
}
如上运行程序发现,线程只会执行一次,并会有异常提示。查看Thread源码
/*** Starts the new Thread of execution. The <code>run()</code> method of* the receiver will be called by the receiver Thread itself (and not the* Thread calling <code>start()</code>).** @throws IllegalThreadStateException - if this thread has already started.* @see Thread#run*/
public synchronized void start() {checkNotStarted();hasBeenStarted = true;nativeCreate(this, stackSize, daemon);
}private void checkNotStarted() {if (hasBeenStarted) {throw new IllegalThreadStateException("Thread already started");}}
可以看出Thread会检查是否执行过,如果已经执行过则会抛出异常。
那么如何使创建的线程可以执行多次呢?
private static void runTask() {new Thread(new Runnable() {@Overridepublic void run() { count++;System.out.println("this is time do task:" + count);}}).start();
}public static void main(String[] args) {for (int i = 0; i < 10; i++) {runTask();}
}
这样的操作线程会执行多次,但是每次执行线程对会重新创建线程对象,虽然任务结束后,垃圾回收器会回收对象,但是如果线程执行多次,频繁的创建对象,回收对象会影响运行效率,还有可能因对象来不及回收产生垃圾内存,这样严重影响性能。如何才能够避免可以重复执行线程,而又不影响效率,可以用线程池来执行。
private static ExecutorService mExecutor = Executors.newSingleThreadExecutor();
private static void runTask() {if (mTaskRunnable == null) {mTaskRunnable = new Runnable() {@Overridepublic void run() {count++;System.out.println("this is time do task:" + count);}};}mExecutor.execute(mTaskRunnable);}
public static void main(String[] args) {for (int i = 0; i < 10; i++) {runTask();}
}
运行显示,多次执行了线程的任务。
开启Thread线程只执行一次相关推荐
- Go的sync.Once(三):once.do(函数名) 函数只执行一次
Once once.do(函数名) 函数只执行一次!执行一次后,其他协程不执行了 // 用once可以保证上面的oncebody被执行一次 package mainimport ("fmt ...
- 避免showModalDialog打开的窗口Page_Load只执行一次
当showModalDialog打开的窗口Page_Load只执行一次,导致 if (!IsPostBack){} 中代码没有执行,查了相关资料,原因在于第一次之后加载都是从缓存中直接获取之前的页面, ...
- php多个请求只执行一次,php使用redis的blPop/brPop,一台服务器多个并发,也只能一次一次执行?...
服务器是使用 nginx + php-fpm 的架构,redis用的是connect来连接,每个网络请求应该都会有单独的 php-fpm 进程.我写了一个循环,每次循环都有 blPop/brPop 和 ...
- vue animate bounceInRight 只执行一遍
touchMove 中左滑 添加bounceInRight ,动画只执行一遍,或者只有某个有动画 解决:第一步:数据出现比动画要慢 在touchEnd中增加延迟,把类名置位空 第二步:把增加bounc ...
- css 页面从左侧向右滑入,动画只执行一次
简单实现了页面进入时的动画: (1)从左侧滑入: (2)只执行一次. <template><div class="big_screen_contant">& ...
- python 为什么只执行一次_python只执行一次
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! #!usrbinpython #coding=utf-8 created on ...
- ansible 命令只执行一次
RUN ONCE 通过run_once: true来指定该task只能在某一台机器上执行一次. 可以和delegate_to 结合使用 - command: /opt/application/upgr ...
- shell 脚本中 while 只执行一次
实例代码 while read line ; do ssh -p20002 $line -o StrictHostKeyChecking=no xxxxxxxxx done < ip.txt w ...
- Jmeter如何在大并发测试下,让登录或者后续接口只执行一次?
这个问题网上的答案其实很多,但是大多不靠谱. 比如推荐使用仅一次控制器,但是仅一次控制器对线程组无效:比如推荐跨线程组调用,但是这样比较繁琐,新人也搞不定: 其实只要对元件熟悉,这个问题很简单,只需要 ...
最新文章
- 固件模块之间的关系 C语言里面的模块
- mongoDB 删除集合后,空间不释放的解决方法
- 维吉尼亚密码(Vigenère Cipher)
- 皮一皮:高手。。。真是高手
- DOS获取局域网内所有正在使用的ip地址
- python3 isinstance用法_对python中assert、isinstance的用法详解
- python装饰器使用多吗_对于Python装饰器使用的一些建议
- .NET常用功能和代码[总结与收藏] (转)
- 常见的几种异常类型-熟记
- SIP协议(基础技术知识)
- JAVA入门级教学之(classpath的配置)
- 如何安装python3_linux如何安装python3
- 华为Mate 30 Pro全新配色曝光:“赤茶橘”颜值超高
- 6-SqlMapConfig.xml配置文件
- unity ui框架_[教程汇总+持续更新]Unity从入门到入坟——收藏这一篇就够了
- 设置,获取和删除Cookies
- php 使用gd库,PHP的gd库使用基础教程
- Java实现MySql分页查询
- 案例研究:手机APP的UI设计流程
- C++核心准则T.61:不要过度参数化成员(SCARY)