Java——线程的创建,线程池

线程

多线程就是一个程序中有多个线程在同时执行。

多线程下CPU的工作原理

实际上,CPU(中央处理器)使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核而言,某个时刻,只能执行一个线程,而CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是在同一时刻运行。

其实,多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,CPU的使用率更高

一、创建线程

方法1:继承Thread类,重写run方法

public class SubThread extends Thread{public SubThread(){super("x5456");     //通过构造方法修改线程名}public void run() {for(int i=0;i<100;i++){System.out.println(super.getName()+i);}}
}

 调用:

public static void main(String[] args) {//创建刚刚继承Thread类的子类的对象SubThread st = new SubThread();//通过setName方法,修改线程名st.setName("x54256");//调用对象的start方法,会自动执行我们重写的run方法st.start();for(int i=0;i<100;i++) {System.out.println(Thread.currentThread().getName()+i);     //获取当前线程的对象,调用getname()方法}
}

方法2:实现接口Runnable,重写run方法

public class SubRunnable implements Runnable{public void run(){for(int i=0;i<100;i++){try {// 调用Thread类的sleep方法,休眠50ms,由于父接口没有throws异常,so我们只能用try...catchThread.sleep(50);  } catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"..."+i);}}
}

调用:

public static void main(String[] args) {//创建实现Runnable接口的类的对象SubRunnable sr = new SubRunnable();//创建Thread类的对象Thread t = new Thread(sr);//启动线程t.start();for(int i=0;i<100;i++){System.out.println(Thread.currentThread().getName()+"..."+i);}
}

方法3:使用匿名内部类,实现多线程程序

匿名内部类的前提:继承或者接口实现

使用方法:

new 父类或者接口(){
  重写抽象方法
}

public static void main(String[] args) {//继承方式  XXX extends Thread{ public void run(){}}new Thread(){public void run(){System.out.println("!!!");}}.start();//实现接口方式  XXX implements Runnable{ public void run(){}}Runnable r = new Runnable(){public void run(){System.out.println("###");}};new Thread(r).start();//==================或=====================new Thread(new Runnable(){public void run(){System.out.println("@@@");}}).start();} 

实现接口的好处:

高内聚,低耦合:模块内能做的事就自己做,模块间的关系要尽量的小

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

多线程的内存图解:

线程的一生: 

二、线程池

线程池,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。

java中,如果每个请求到达就创建一个新线程,开销是相当大的。在实际使用中,创建和销毁线程花费的时间和消耗的系统资源都相当大,甚至可能要比在处理实际的用户请求的时间和资源要多的多。除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源。如果在一个jvm里创建太多的线程,可能会使系统由于过度消耗内存或“切换过度”而导致系统资源不足。为了防止资源不足,需要采取一些办法来限制任何给定时刻处理的请求数目,尽可能减少创建和销毁线程的次数,特别是一些资源耗费比较大的线程的创建和销毁,尽量利用已有对象来进行服务。

线程池主要用来解决线程生命周期开销问题和资源不足问题。通过对多个任务重复使用线程,线程创建的开销就被分摊到了多个任务上了,而且由于在请求到达时线程已经存在,所以消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使用应用程序响应更快。另外,通过适当的调整线程中的线程数目可以防止出现资源不足的情况。

方法1:使用线程池方式--Runnable接口

public static void main(String[] args) {//调用工厂类的静态方法,创建线程池对象(ExecutorService接口的实现类)//返回线程池对象,是返回的接口ExecutorService es = Executors.newFixedThreadPool(2);  //池内有2个线程//调用接口实现类对象es中的方法submit提交线程任务//将Runnable接口实现类对象,传递es.submit(new SubRunnable());es.submit(new SubRunnable());es.submit(new SubRunnable());es.submit(new SubRunnable());
}

实现的Runnable接口

public class ThreadPoolRunnable implements Runnable {public void run(){System.out.println(Thread.currentThread().getName()+" 线程提交任务");}
}

方法2:使用线程池方式Callable接口

之前的实现方法,线程运行完没有返回值,而且不能抛异常。

Callable接口:与Runnable接口功能相似,用来指定线程的任务。其中的call()方法,用来返回线程任务执行完毕后的结果,call方法可抛出异常。

public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService es = Executors.newFixedThreadPool(2);//提交线程任务的方法submit方法返回 Future接口的实现类Future<Integer> f = es.submit(new SubCallable());//获取返回值Integer i = f.get();System.out.println(i);
}

实现的Callable接口

public class SubCallable implements Callable<Integer>{@Overridepublic Integer call() {return 123;}
}

使用线程实现异步计算

private int a;
//通过构造方法传参
public GetSumCallable(int a){this.a=a;
}public Integer call(){int sum = 0 ;for(int i = 1 ; i <=a ; i++){sum = sum + i ;}return sum;
}

ThreadPoolDemo.java

/** 使用多线程技术,求和* 两个线程,1个线程计算1+100,另一个线程计算1+200的和* 多线程的异步计算*/
public class ThreadPoolDemo {public static void main(String[] args)throws Exception {ExecutorService es = Executors.newFixedThreadPool(2);Future<Integer> f1 =es.submit(new GetSumCallable(100));Future<Integer> f2 =es.submit(new GetSumCallable(200));System.out.println(f1.get());System.out.println(f2.get());es.shutdown();}
}

FutureTask的使用

FutureTask继承了Callable和Future接口,所以它既能像callable一样被Thread执行,也能像Future那样获取结果。

    @Overridepublic boolean testServiceUrl(ServiceUrlTestDTO url){// 调用地图服务Callable<Boolean> callable = new WebServiceUtil(url.getUrl(),url.getProxy(),url.getToken());FutureTask<Boolean> futureTask = new FutureTask<>(callable);Thread thread = new Thread(futureTask);thread.start();try {Boolean isOK = futureTask.get();System.out.println("服务【"+ url.getUrl() +"】测试:"+ isOK);return isOK;} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}return false;}

  

转载于:https://www.cnblogs.com/x54256/p/8443794.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初级第一旬05— 蓝字观试题

准提法网络佛学院 准提法教学平台 一、高七师提倡初学准提法者&#xff0c;应先观蓝字&#xff0c;在《显密圆通成佛心要集》中有依据吗&#xff1f; 二、正修的时候&#xff0c;如果不得不中断怎么办&#xff1f; 三、蓝字观有几种手印&#xff1f;可以单独使用吗&#xff1f;…

java并查集找朋友圈_图—并查集(解决朋友圈问题)

图也是一种 非线性结构&#xff0c;是由多个顶点组成的关系集合组成的一种数据结构。图可以分为两种&#xff0c;无向图和有向图。★图的定义:★典型问题&#xff1a;利用图能够解决很多问题&#xff0c;这里有一个较为典型的问题&#xff0c;假如已知有n个人和m对好友关系(存于…

技术这东西,不可不看,不可全看.

最近忙着玩开心,好久没来CSDN了,首页上有90后程序员的消息了,稍微感慨一下,曾几何时,自己这个80后还被70后的前辈所笑话,转眼就成了5年经验的老油条了.呵呵. 5年,个人认为经历还是有些代表性的,就跟刚入行或者即将入行的哥们交个底吧,这5年到底学到了什么. 如果你看完这篇文…

rand.nextint()

自从JDK最初版本发布起&#xff0c;我们就可以使用java.util.Random类产生随机数了。在JDK1.2中&#xff0c;Random类有了一个名为nextInt()的方法&#xff1a;public int nextInt(int n)给定一个参数n&#xff0c;nextInt(n)将返回一个大于等于0小于n的随机数&#xff0c;即&a…

Android开发常用的插件及工具

1、GitHub,这个不管是做安卓还是其他&#xff0c;只要是开发就必上的网站&#xff0c;也是天朝没有墙掉为数不多的网站 2、Stack OverFlow,这个和上面一样&#xff0c;国外非常著名的问答网站&#xff0c;在上面基本上很多问题都可以得到解决 3、Genymotion模拟器&#xff0c;搞…

java poi 设置标题_poi生成Word时指定文本样式,如“正文”,“标题1”,“标题2”等...

POI生成Word时&#xff0c;设置段落的样式String style "2"; //标题2的样式XWPFParagraph xwpfParagraph doc.insertNewParagraph(run);xwpfParagraph.setStyle(style);其实设置其他的样式都一样。例如&#xff1a;你想设置你的样式为“标题2”(“标题2”只是你在w…

使用python做最简单的爬虫

使用python做最简单的爬虫 --之心 #第一种方法import urllib2 #将urllib2库引用进来responseurllib2.urlopen("http://www.baidu.com") #调用库中的方法&#xff0c;将请求回应封装到response对象中htmlresponse.read() #调用response对象的read&#xff08;&#x…

SurfaceView介绍

SurfaceView介绍 通常情况程序的View和用户响应都是在同一个线程中处理的&#xff0c;这也是为什么处理长时间事件&#xff08;例如访问网络&#xff09;需要放到另外的线程中去&#xff08;防止阻塞当前UI线程的操作和绘制&#xff09;。但是在其他线程中却不能修改UI元素&…

产品与市场,究竟哪一个重要

上篇我们讲到B2C继B2B和C2C红透之后&#xff0c;也正在迅速的窜红。这一看法可不是我老邢杜撰&#xff0c;凭空想出来的&#xff0c;我们也可以从近期的主要媒体杂志上看到这个弥端。《二十一世纪报道》、《创业家》、《市场与营销》这些经济类杂志&#xff0c;均用大幅篇幅甚至…

enumerate()使用

enumerate()使用 如果对一个列表&#xff0c;既要遍历索引又要遍历元素时&#xff0c;首先可以这样写&#xff1a; list1 ["这", "是", "一个", "测试"] for i in range (len(list1)): print i ,list1[i] 上述方法有些累赘&#xff0…

php在window,php在window上的问题

C:/php-7/php-cgi.exe -b 127.0.0.1:9000 -c C:/php-7/php.ini用以上方式打开php的话&#xff0c;会自动的关闭&#xff0c;到处查了后说什么东西默认是500次&#xff0c;到了的话cgi就会关闭所以才想到用以下的批处理办法去解决echo offecho Starting PHP FastCGI...set PHP_F…

(三)SpringBoot之配置文件详解:Properties和YAML

一、配置文件的生效顺序&#xff0c;会对值进行覆盖&#xff1a; 1. TestPropertySource 注解2. 命令行参数3. Java系统属性&#xff08;System.getProperties()&#xff09;4. 操作系统环境变量5. 只有在random.*里包含的属性会产生一个RandomValuePropertySource6. 在打包的j…

fscanf()php,fscanf函数的用法

以前解析有规律的文件的时候要么用正则表达式&#xff0c;要么就是傻傻的自己写程序来解析有规律的文件。今天突然发现c的库函数中有一个现成的可以解析有规律的文件的函数&#xff0c;就是fscanf()函数。fscanf 位于头文件中&#xff0c;函数原型为 int fscanf(FILE * stream,…

ComponentName知识

以下是ComponentName的API /*** Create a new component identifier from a Context and Class object.* * param pkg A Context for the package implementing the component, from* which the actual package name will be retrieved.* param cls The Class object of the de…

为什么设计师应该学习编写代码

通常&#xff0c;在完成了一件网页设计后&#xff0c;设计师的无知都会显露无遗而备受指责。他们把创建网页代码的繁重工作都留给了程序员们。这种现象不只出现在网络开发行业&#xff0c;在软件及游戏开发业也是如此&#xff08;完整图文版&#xff09;。残酷的事实就是&#…

unittest核心要素

1 TestCase 一个TestCase的实例就是一个测试用例。什么是测试用例呢&#xff1f;就是一个完整的测试流程&#xff0c; 包括测试环境的准备(setUp)&#xff0c;执行测试代码(run)&#xff0c;以及测试后环境的还原&#xff08;tearDown&#xff09;。单元 测试&#xff08;unit …

iOS内存区域部分内容

目前参考这里&#xff1a; https://www.zhihu.com/question/263823072/answer/273452932 以后整理相关的代码问题。 更多参考资料&#xff1a; https://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap 堆栈&#xff1a;https://baike.baidu.com/ite…

php 启动ffmpeg,安装php扩展 ffmpeg-php

首先先下载扩展包扩展下载地址: http://nchc.dl.sourceforge.net/project/ffmpeg-php/ffmpeg-php/0.6.0/ffmpeg-php-0.6.0.tbz2进入 ffmpeg-php目录 进行编译扩展/usr/local/php/bin/phpize./configure --with-php-config/usr/local/php/bin/php-configmake 出错报错情况make: …

armeabi和armeabi-v7a的区别

armeabi默认选项&#xff0c; 支持基于 ARM* v5TE 的设备 支持软浮点运算&#xff08;不支持硬件辅助的浮点计算&#xff09; 支持所有 ARM* 设备 armeabi-v7a 支持基于 ARM* v7 的设备 支持硬件 FPU 指令 支持硬件浮点运算 不同手机由于cpu的不同&#xff0c;使用不同的驱动…

浅析Numpy.genfromtxt及File I/O讲解

Python 并没有提供数组功能&#xff0c;虽然列表 (list) 可以完成基本的数组功能&#xff0c;但它并不是真正的数组&#xff0c;而且在数据量较大时&#xff0c;使用列表的速度就会慢的让人难受。为此&#xff0c;Numpy 提供了真正的数组功能&#xff0c;以及对数据快速处理的函…