多线程创建方式有4种

创建线程的第一种方式。继承Thread类 
1.继承Thread类 
2.重写Thread类中的run方法--目的将自定义代码存储在run方法.让线程执行
3.调用线程的start()方法改方法有两个作用1启动线程 2让jvm调用run方法执行线程任务

创建线程的第二种方式。实现Runnable接口。
1,定义类实现Runnable接口:避免了继承Thread类的单继承局限性。
2,覆盖接口中的run方法。将线程任务代码定义到run方法中。
3,创建Thread类的对象:只有创建Thread类的对象才可以创建线程。
4,将Runnable接口的子类对象作为参数传递给Thread类的构造函数。
因为线程已被封装到Runnable接口的run方法中,而这个run方法所属于Runnable接口的子类对象,
所以将这个子类对象作为参数传递给Thread的构造函数,这样,线程对象创建时就可以明确要运行的线程的任务。
5,调用Thread类的start方法开启线程。

第二种方式实现Runnable接口避免了单继承的局限性,所以较为常用。
实现Runnable接口的方式,更加的符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务。
继承Thread类:线程对象和线程任务耦合在一起。一旦创建Thread类的子类对象,既是线程对象,有又有线程任务。
实现runnable接口:将线程任务单独分离出来封装成对象,类型就是Runnable接口类型。
Runnable接口对线程对象和线程任务进行解耦。

//通过查看源码了解一下将runnable接口的子类对象作为参数传递给Thread构造函数的原因。
class Thread{ private Runnable target; Thread(Runnable target)
{
this.target = target;
}
public void run() {
if (target != null) {
target.run();
}
}
public void start()
{
run();
}
} Runnable d = new Demo();
Thread t = new Thread(d);
t.start();
class Demo implements Runnable
{
private String name;
Demo(String name)
{
this.name = name;
}
//覆盖了接口Runnable中的run方法。
public void run()
{
for(int x=1; x<=20; x++)
{
System.out.println("name="+name+"..."+Thread.currentThread().getName()+"..."+x);
}
}
} class ThreadDemo2
{
public static void main(String[] args)
{
//创建Runnable子类的对象。注意它并不是线程对象。
Demo d = new Demo("Demo");
//创建Thread类的对象,将Runnable接口的子类对象作为参数传递给Thread类的构造函数。
Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
//将线程启动。
t1.start();
t2.start(); System.out.println(Thread.currentThread().getName()+"----->"); }
}

第三种方式:

* 实现 Runnable
* 实现Callable
* 它俩区别:Runnable run方法没有返回值
* Callable call方法有返回值

* 创建线程第三种方式:实现Callable接口
* new Thread() api构造方法中没有直接传递Callable接口的 只有传Runnable
* 思考是不是有一个桥梁 将Callable和Runnable它俩联系起来的
* 这个桥梁就是FutureTask
*
* FutureTask 构造中传递的是Callable接口, 间接实现Runnable接口
* 因为FutureTask间接实现Runnable接口所以可以传递到new Thread()构造方法中

class MyThread implements Callable<Integer> {

    @Override
public Integer call() throws Exception {
System.out.println(Thread.currentThread().getName()+"**************come in Callable");
return 1024;
} }
public class CallableDemo { public static void main(String[] args) throws InterruptedException, ExecutionException {
FutureTask<Integer> task = new FutureTask<>(new MyThread()); new Thread(task, "AA").start();
// new Thread(task, "BB").start(); //多个线程抢一个task,只会执行一次,想要执行多次起多个FutureTask int result01 = 100; int result02 = task.get(); //建议放到最后,否则会造成阻塞 // System.out.println("******result:"+task.get());
System.out.println("******result:"+(result01+result02));
} }

第4种方式:线程池

/**
* 生产环境 都是自定义线程池
*
* 合理配置线程池 如何考虑
*
* CPU密集型 公式 :cpu核数+1
* IO密集型 公式:cpu核数/1-阻塞系数 阻塞系数在0.8-0.9之间
* 比如:8核CPU: 8/1-0.9=80个线程数
*
* Runtime.getRuntime().availableProcessors() 得到CPU核数
*
  自定义线程从池7个参数说明
  核心线程数, 阻塞队列,最大线程数,拒绝策略, 其他线程空闲销毁时间,空闲时间单位,线程池工厂
*
* @author wg
*
*/
public class MyThreadPool {
public static void main(String[] args) {
System.out.println(Runtime.getRuntime().availableProcessors()); ExecutorService threadPool = new ThreadPoolExecutor(
2,
5,
1L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(3),
Executors.defaultThreadFactory(),
// new ThreadPoolExecutor.AbortPolicy() 超过极限8就报异常
// new ThreadPoolExecutor.CallerRunsPolicy() //测试10 超过的处理不过来的回退到调用者
// new ThreadPoolExecutor.DiscardOldestPolicy() //测试10
new ThreadPoolExecutor.DiscardPolicy() ); try {
//模拟10个用户来办理业务,每个用户就是一个来自外部的请求线程
for (int i = 1; i <= 10; i++) {
threadPool.execute(()->{
System.out.println(Thread.currentThread().getName()+"\t 办理业务");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
threadPool.shutdown();
}
} }

java中创建多线程两种方式以及实现接口的优点的更多相关文章

  1. K:java中序列化的两种方式—Serializable或Externalizable

    在java中,对一个对象进行序列化操作,其有如下两种方式: 第一种: 通过实现java.io.Serializable接口,该接口是一个标志接口,其没有任何抽象方法需要进行重写,实现了Serializ ...

  2. Java线程创建的两种方式

    java多线程总结一:线程的两种创建方式及优劣比较 (一)---之创建线程的两种方式 java实现多线程的两种方法的比较

  3. 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口

    //继承thread类 class PrimeThread extends Thread{ long minPrime; PrimeThread(long minPrime) { this.minPr ...

  4. Virsh中创建虚拟机两种方式define和create的区别

    本质上两者一样的,都是从xml配置文件创建虚拟机 define  丛xml配置文件创建主机但是不启动 create  同样是丛xml配置文件创建主机,但是可以指定很多选项,比如是否启动,是否连接控制台 ...

  5. 【转载】JAVA中线程的两种实现方法-实现Runnable接口和继承Thread类

    转自: http://blog.csdn.net/sunguangran/article/details/6069317 非常感谢原作者,整理的这么详细. 在java中可有两种方式实现多线程,一种是继 ...

  6. Java中创建对象的几种方式

    Java中创建对象的五种方式: 作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字.使用Cl ...

  7. 对Java代码加密的两种方式,防止反编译

    使用Virbox Protector对Java项目加密有两种方式,一种是对War包加密,一种是对Jar包加密.Virbox Protector支持这两种文件格式加密,可以加密用于解析class文件的j ...

  8. Java中创建对象的五种方式

    我们总是讨论没有对象就去new一个对象,创建对象的方式在我这里变成了根深蒂固的new方式创建,但是其实创建对象的方式还是有很多种的,不单单有new方式创建对象,还有使用反射机制创建对象,使用clone ...

  9. 【转】Java中创建对象的5种方式

    Java中创建对象的5种方式   作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有 ...

随机推荐

  1. ASP.NET Core部署到CentOS7,使用Nginx代理

    ASP.NET Core 的运行环境由新开发的 Kestrel Server 负责,IIS 退回到 HTTP 的侦听器的角色,微软也特别为了这个需求开发了 IIS Platform Handler,以 ...

  2. 如何解决苹果Mac系统无法识别U盘

       1.在Mac机上打开“磁盘工具”,将U盘重新分区, 2.格式选“exFAT”.该格式分区Win及Mac系统中都可以读和写,特别是可以支持大于4GB的大文件.但是一些高清播放机可能不支持. 3.以 ...

  3. 【CC2530入门教程-06】CC2530的ADC工作原理与应用

    第6课  CC2530的ADC工作原理与应用 广东职业技术学院  欧浩源 一.A/D转换的基本工作原理 将时间上连续变化的模拟量转化为脉冲有无的数字量,这一过程就叫做数字化,实现数字化的关键设备是AD ...

  4. 将HTML导出生成word文档

    前言: 项目开发中遇到了需要将HTML页面的内容导出为一个word文档,所以有了这边随笔. 当然,项目开发又时间有点紧迫,第一时间想到的是用插件,所以百度了下.下面就介绍两个导出word文档的方法. ...

  5. UNITY VR 视频/图片 开发心得(一)

    现在的VR似乎没有之前那么火热了,于是乎我居然开始了VR征程... 说起VR,对于没有接受过相关知识的人来说可能看起来比较高大上,但是VR的原理却没有想象中那么复杂.总的来说,VR之所以能够产生立体感 ...

  6. OpenCV 之 图像分割 (一)

    1  基于阈值 1.1  基本原理 灰度阈值化,是最简单也是速度最快的一种图像分割方法,广泛应用在硬件图像处理领域 (例如,基于 FPGA 的实时图像处理). 假设输入图像为 f,输出图像为 g,则经 ...

  7. Command "python setup.py egg_info" failed with error code 10

    1:今天系统重装以后,下载了新的版本的python3.6.1.然后想通过pycurl模块测试URL,突然发现windows10下我无法通过pip安装pycurl模块了,报错内容如下 Collectin ...

  8. Java ee el表达式

    以前在开发的时候,偶尔会遇到jsp页面不支持el表达式的情况. 这个的原因是因为El功能被关闭了, 当时的解决办法是关闭忽略.isELIgnored 设设置 但是为什么有时候不用设置也可以了呢.发现原 ...

  9. 【Storm】Storm实战之频繁二项集挖掘

    一.前言 针对大叔据实时处理的入门,除了使用WordCount示例之外,还需要相对更深入点的示例来理解Storm,因此,本篇博文利用Storm实现了频繁项集挖掘的案例,以方便更好的入门Storm. 二 ...

  10. 【Xbox one S】开箱&开机&初入坑心得

    再来一发水贴,先上产品标准照镇贴: 前言 身为一个资深单机游戏玩家,常年混迹在PC平台,但内心深处一直对主机有种迷之向往,感觉那才是单机游戏的正处之地,坐沙发上拿着手柄对着电视跌宕起伏才是正确的游戏姿 ...