1、实现多线程的方式

1)继承Thread类

2)实现Runnable接口

3)Java5以后可通过实现Callable接口,该接口中的call方法可以在线程执行结束时产生一个返回值,代码如下:

class  MyTask  implements  Callable{

private int upperBounds;

public MyTask(int upperBounds) {

this.upperBounds = upperBounds;

}

@Override

public Integer call() throws Exception {

int sum = 0;

for(int i = 1; i <= upperBounds; i++) {

sum += i;

}

return sum;

}

}

public class Test {        public static void main(String[] args) throws Exception {          List> list = new ArrayList<>();          ExecutorService service = Executors.newFixedThreadPool(10);          for(int i = 0; i < 10; i++) {              list.add(service.submit(new MyTask((int) (Math.random() * 100))));          }                    int sum = 0;          for(Futurefuture : list) {

while(!future.isDone()) ;

sum += future.get();

}

System.out.println(sum);

}

}

2、实现Runnable接口相比继承thread类的优势

1)可以避免Java中单继承带来的局限

2)可增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的

3)适合多个相同程序代码的线程取处理同一个资源的情况

3、线程状态转换

1)新建状态(new):新创建了一个线程对象。

2)就绪状态(Runnable):线程对象 创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。注意:不能对已启动的线程再次调用start()方法,否则会抛出Java.lang.IllegalThreadStateException异常。

3)运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

4)阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分为三种:

A、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。

B、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。

C、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep状态超时,join等待线程终止或超时,线程重新转入就绪状态。

5)死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

4、造成线程阻塞的几个方法

1、线程睡眠--sleep

如果我们需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread的sleep方法。

注意如下几个问题:1)sleep是静态方法,最好不要用Thread的实例对象去调用它,因为它睡眠的始终是当前正在运行的线程而不是调用它自己的线程对象,sleep方法只对正在运行状态的线程对象有效。

publicstaticvoidmain(String[] args) throws InterruptedException {

System.out.println(Thread.currentThread().getName());

MyThread myThread=newMyThread();

myThread.start();

myThread.sleep(1000);//这里sleep的就是main线程,而非myThread线程

MyThread.sleep(1000);//也是main线程

Thread.sleep(10);

for(inti=0;i<100;i++){

System.out.println("main"+i);

}

}

2)Java线程调度是Java多线程的核心,只有良好的调度,才能充分发挥系统的性能,提高程序的执行效率。但是不管程序员怎么编写调度,只能最大限度的影响线程执行的次序,而不能做到精准控制。因为使用sleep方法之后,线程是进入阻塞状态的,只有当睡眠的时间结束,才会重新进入到就绪状态,而就绪状态进入到运行状态是由系统控制的,我们不可能精准的去干涉它,所以如果调用thread.sleep(1000);使得线程睡眠1秒,可能结果会大于1秒。

2、线程让步--yield

yield方法和sleep方法有点相似,它也是thread类提供的一个静态方法,它可以让当前正在执行的线程暂停,让出cpu资源给其他的线程。但是和sleep方法不同的是,它不会让线程进入到阻塞状态,而是进入到就绪状态。yield方法只是让当前线程暂停一下,重新进入就绪的线程池中,让系统的线程调度器重新调度一次,完全可能出现这样的情况:当某个线程调用yield方法后,线程调度器又将其调度出来重新进入到运行状态执行。

①、sleep方法暂停当前线程后,会进入阻塞状态,只有当睡眠时间到了,才会转入就绪状态。而yield方法调用后 ,是直接进入就绪状态,所以有可能刚进入就绪状态,又被调度到运行状态。

②、sleep方法声明抛出了InterruptedException,所以调用sleep方法的时候要捕获该异常,或者显示声明抛出该异常。而yield方法则没有声明抛出任务异常。

③、sleep方法比yield方法有更好的可移植性,通常不要依靠yield方法来控制并发线程的执行。

java程序中单方法接口通常是,Android面试题1--Java基础之线程(持续更新)相关推荐

  1. java程序中单方法接口通常是,Java基础知识整理

    面向对象和面向过程的区别 面向过程 优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发.Linux/Unix等一般采用面向过程开发,性能是最重要的因素. ...

  2. java程序cpu突然飚高_高频面试题:Java程序占用 CPU 过高怎么排查

    这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的.线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是一 ...

  3. 在JAVA语言程序中main_在Java程序main方法中,正确的参数是

    [单选题]下列叙述中,错误的是 [填空题]Access属于()数据库,Access中,不允许在主关键字字段中有重复值或(). [单选题]如下哪些字符串是Java中的标识符? [填空题]常用的基本电量传 ...

  4. Java程序调用MATLAB接口

    Java程序调用MATLAB接口 文章目录 Java程序调用MATLAB接口 一.注意事项 二.环境安装 三.MATLAB如何生成JAR包 四.MATLAB生成的JAR包如何引入到Java程序中 五. ...

  5. 2020年Android面试题三部曲——Java部分

    2020年Android面试题三部曲--Java部分 序 常问JAVA知识点 基本数据类型 abstract和interface的区别 重写和重载的区别 break.continue.return区别 ...

  6. Java程序员周末时间搞锭银行信息管理系统毕业设计(java+springboot+mybatis+mysql+vue+elementui)等实现 免费源码+论文答辩资料获取

    Java程序员周末时间搞锭银行信息管理系统毕业设计(java+springboot+mybatis+mysql+vue+elementui)等实现 前言介绍: 在社会快速发展的影响下,银行继续发展,大 ...

  7. Java程序员的求职面试简历应该怎么写?Java常用框架有哪些?

    [Java程序员]的求职面试简历应该怎么写?首先要做到信息的完整,比如基本信息.求职意向.工作经历/项目经验.个人技能这几大简历版块一定得有.然后简历内容要做到简单明了,详略得当.即要求大家简单概括自 ...

  8. Android 高仿App项目归纳整理,持续更新中…

    Android 高仿App项目归纳整理,持续更新中- Android高仿App项目整理,包含高仿了一些大公司的app,有基于Java,Kotlin,Flutter等语言的.对于开发我们自已的项目时可以 ...

  9. java里format报错,我的Android进阶之旅------Java字符串格式化方法String.format()格式化float型时小数点变成逗号问题...

    今天接到一个波兰的客户说有个APP在英文状态下一切运行正常,但是当系统语言切换到波兰语言的时候,程序奔溃了.好吧,又是我来维护. 好吧,先把系统语言切换到波兰语,切换到波兰语的方法查看文章 地址:ht ...

最新文章

  1. 使virtualenv从您的全局站点包继承特定的包
  2. 优达学城《DeepLearning》2-3:权重初始化
  3. Django 框架13: 自定义过滤器和标签
  4. 详解虚函数的实现过程之菱形继承(5)
  5. java什么叫元素_什么是Java做什么 - 每个元素使它们成为对象类型?
  6. 4月第三周国内域名解析商Top10:万网升至20.32%
  7. codeforces 776C Molly's Chemicals(连续子序列和为k的次方的个数)
  8. wireshark网络分析笔记
  9. 电脑电子版文件怎么弄_清空回收站后,如何找回删除的文件?
  10. 电力-104规约实际测试3
  11. Java微信小微商户进件,已经解决接口暂无权限,稍后再试的问题
  12. 小米路由器3G刷入OpenWrt
  13. LaTeX新手半小时速成手册(不速成你打我
  14. 【Flutter核心类分析】深入理解BuildContext
  15. 360链接云服务器失败怎么回事,360智能摄像机连接失败原因 360智能摄像机连接失败解决办法...
  16. 一个高效的积分兑换商城系统怎么搭建
  17. 测判三极管的口诀 (挑战者)
  18. 三阶魔方没有。四阶魔方 有的公式
  19. 群、环、域的概念,定义和理解.
  20. Socket通信流程和套接字作用

热门文章

  1. Android的手势识别
  2. ajaxutil java,Ajax的工具类AjaxUtils,使用struts返回Json类型
  3. 学了Java就有用,是本世纪最大的谎言
  4. linux操作系统下部署Javaweb项目教程
  5. java多线程 游戏_java利用多线程和Socket实现猜拳游戏
  6. java ab与ab的区别 a|b与a||b的区别 break、continue、return
  7. matlab dynprog,动态规划算法
  8. Musical Theme POJ - 1743(后缀数组+二分)
  9. java中四种修饰符
  10. 求计算两个时间的差(DateTime类和TimeSpan类)