package cn.sasa.demo2;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class Test {
public static void main(String[] args) {
/**
* 线程状态
* Thread.State
*
* NEW
* 至今尚未启动 new ...()
*
* RUNNABLE
* 正在执行 start()
*
* BLOCKED
* 受阻塞 并 等待某个监视器锁
*
* WAITING
* 无限期等待另一个线程来执行某一特定操作的线程
* wait() 等待 notify()唤醒
*
* TIMED_WAITING
* 等待另一线程来执行,有等待时限 休眠 sleep()
*
* TERMINATED
* 已退出---- run()结束 / stop() 已过时
*
* 受阻塞:线程具有CPU的执行资格,等CPU的资源
* 休眠等待:线程放弃CPU的执行资格
*
* 线程池
* 从jdk5之后内置线程池
*
* 1、使用工厂类Executors 中的静态方法创建线程对象,指定线程的个数
* 2、调用newFixedThreadPool 返回线程池对象 ExecutorService
*
*/
ExecutorService es = Executors.newFixedThreadPool(2);
es.submit(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName() + "...hello");
}
}); es.submit(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName() + "...abc");
}
}); es.submit(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName() + "...hahaha");
}
}); //shutdown 销毁线程池,不常用,因为建立线程池就是为了线程不被销毁
//es.shutdown(); for(int i=0; i<100; i++) {
System.out.println(i);
}
}
}

创建线程的第三种方式:实现Callable接口,传入线程池

实现Callable接口中的call方法,可以有返回值,可以抛异常

package cn.sasa.demo3;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; public class Test {
public static void main(String[] args) {
//创建线程的第三种方式:实现Callable接口 传入线程池
//Callable 可以有返回值,可以抛异常
ExecutorService es = Executors.newFixedThreadPool(2);
Future<String> strf = es.submit(new MyCallable());
try {
System.out.println(strf.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package cn.sasa.demo3;

import java.util.concurrent.Callable;

public class MyCallable implements Callable<String> {

    @Override
public String call() throws Exception {
return "ho ho ho";
} }

java 线程 (二) 线程池的更多相关文章

  1. (原创)JAVA多线程二线程池

    一,线程池的介绍 线程池包括一下三种: 线程池名称 创建方法 特点 其他 固定大小线程池 ExecutorService threadpool = Executors.newFixedThreadPo ...

  2. C#中的线程(二) 线程同步基础

    1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...

  3. 第二十篇 .NET高级技术之C#中的线程(二) 线程同步基础

    1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...

  4. MFC线程(二):线程同步临界区CRITICAL SECTION

    当多个线程同时使用相同的资源时,由于是并发执行,不能保证先后顺序.所以假如时一个公共变量被几个线程同时使用会造成该变量值的混乱. 下面来举个简单例子. 假如有一个字符数组变量 char g_charA ...

  5. java 多线程 4 线程池

    系统启动一个新线程的成本是比较高的,因为它涉及到与操作系统的交互.在这种情况下,使用线程池可以很好的提供性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 与数据库连接池类似 ...

  6. (转)java自带线程池和队列详细讲解 - CSDN过天的专栏

    一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.util ...

  7. java自带线程池和队列详细讲解

    Java线程池使用说明 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后 ...

  8. Java多线程和线程池

    转自:http://blog.csdn.net/u013142781/article/details/51387749 1.为什么要使用线程池 在Java中,如果每个请求到达就创建一个新线程,开销是相 ...

  9. Java 四种线程池的用法分析

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { ...

  10. Java多线程之线程池详解

    前言 在认识线程池之前,我们需要使用线程就去创建一个线程,但是我们会发现有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因 ...

随机推荐

  1. 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-13 emWin底层驱动接口介绍

    视频简介:该视频介绍emWin底层驱动接口. 源视频包下载地址:链接:http://pan.baidu.com/s/1nvPpC2d 密码:cbb7 银杏科技优酷视频发布区:http://i.youk ...

  2. halcon模板匹配

    在机器视觉应用中,经常需要对图像进行仿射变换.1.在基于参考的视觉检测中,由于待检图像与参考图像或多或少都会存在几何变化(平移.旋转.缩放等),所以在做比较之前一般都要对待检图像进行仿射变换以对齐图像 ...

  3. SpringBoot整合Mail

    前言 SpringBoot实现邮件功能是非常的方便快捷的,因为SpringBoot默认有starter实现了Mail. 发送邮件应该是网站的必备功能之一,什么注册验证,忘记密码或者是给用户发送营销信息 ...

  4. Ubuntu16.04安装xgboost

    1.Python下安装方法 git clone --recursive https://github.com/dmlc/xgboost cd xgboost make -j4 cd python-pa ...

  5. docker中,如何将镜像保存为tar文件或者将镜像保存为文件,将tar文件导入到docker中

    需求说明: 在实际使用docker的过程中,比如某些机器不能上网,恰巧需要某些docker镜像,一般可以采用在能上网的机器上,pull下来基础镜像,然后将docker 镜像保存为文件,在不能上网的机器 ...

  6. [AWS] OAuth2.0

    Ref: 理解OAuth 2.0 若干专有名词: (1)Third-party application:第三方应用程序,本文中又称"客户端"(client),即上一节例子中的&qu ...

  7. vue图片放大镜效果

    原作者地址:https://github.com/lemontree2000/vue-magnify 经测试,原插件在使用时有bug,即在预览时进行鼠标滚动,导致遮罩层计算错误.我已修复该bug,特分 ...

  8. mem 0908

    taglib http://blog.csdn.net/zyujie/article/details/8735730 dozer: Dozer可以在JavaBean到JavaBean之间进行递归数据复 ...

  9. SyntheticEvent

    在react 的事件中使用SyntheticEvent 就会出现下面的报错 <input onChange={async e => { await foo() ... }} /> 那 ...

  10. Spring.NET依赖注入框架学习--简单对象注入

    Spring.NET依赖注入框架学习--简单对象注入 在前面的俩篇中讲解了依赖注入的概念以及Spring.NET框架的核心模块介绍,今天就要看看怎么来使用Spring.NET实现一个简单的对象注入 常 ...