Java的线程机制是抢占式的,所谓的抢占式指的是每一个线程都会被分配一个指定大小的时间片,一旦这个时间片用完,就会通过上下文切换到另一个线程上去。

并发是主要是为了提高单处理器的性能。创建一个线程会有上下文切换和线程创建的消耗,那为什么要不只用串行呢?因为要考虑到阻塞这一个情况,一旦使用串行,某一项任务产生了阻塞,那么后面的任务都无法开展。

通常函数式语言能做到并发任务彼此隔离。

在线程这个层面上,系统又分为协作式系统和抢占式系统。

线程创建

继承Thread实现多线程

实现Runnable接口实现多线程

使用Callable实现多线程

使用Callable实现,相比于继承Thread类和实现Runnable接口,它的不同之处在于可以在任务结束的时候返回一个值。使用方法:

实现Runnable接口,覆写call方法。调用ExecutorService对象的submit方法,返回来的对象要放在Future中,如返回的是String,则Future。

调用get即可获得线程结束时返回的值

public class ThreadTest4 {

	public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
Future<String> result = exec.submit(new MyThread());
for(int i = 0;i<1000;i++){
System.out.println("main");
}
try {
System.out.println(result.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} } } class MyThread implements Callable<String>{ @Override
public String call() throws Exception {
for(int i = 0;i<1000;i++){
System.out.println("test");
}
return "任务完成";
}
}

start()与run()

run方法相当于一次普通的方法调用,并不会创建线程。

public class CreateThread {

    static class Test implements Runnable{

        @Override
public void run() {
System.out.println("test");
}
} public static void main(String[] args) {
new Thread(new Test()).run();
} }

执行后使用线程快照,发现只有一个main线程

如果改成start,则会成功创建线程。

线程停止

终止线程的几种方式:

  • 线程正常退出,也就是run方法执行完
  • 使用stop方法强行终止,不推荐
  • 使用interrupt方法中断线程

interrupt 终止线程

public class ThreadDemo {

    public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
myThread.start();
TimeUnit.SECONDS.sleep(5L);
myThread.interrupt(); } } class MyThread extends Thread { @Override
public void run() {
super.run();
for (int i = 0; ; i++) {
System.out.println(this.isInterrupted());
if (this.isInterrupted()) {
System.out.println("线程终止");
break;
}
System.out.println(i);
try {
TimeUnit.SECONDS.sleep(2L);
} catch (InterruptedException e) {
e.printStackTrace();
this.interrupt();
}
System.out.println("test----------");
}
}
}

运行结果

线程休眠

Thread.sleep()是Thread类的一个静态方法,使当前线程休眠,进入阻塞状态(暂停执行),如果线程在睡眠状态被中断,将会抛出IterruptedException中断异常。

sleep(0)

放弃当前线程的时间片,将CPU时间片让给优先级高于或等于当前线程的其他线程。

参考文档

《Java编程思想》

Java并发(一)—— 使用多线程的更多相关文章

  1. java 并发性和多线程 -- 读感 (一 线程的基本概念部分)

    1.目录略览      线程的基本概念:介绍线程的优点,代价,并发编程的模型.如何创建运行java 线程.      线程间通讯的机制:竞态条件与临界区,线程安全和共享资源与不可变性.java内存模型 ...

  2. Java 并发和多线程(一) Java并发性和多线程介绍[转]

    作者:Jakob Jenkov 译者:Simon-SZ  校对:方腾飞 http://tutorials.jenkov.com/java-concurrency/index.html 在过去单CPU时 ...

  3. Java并发性和多线程

    Java并发性和多线程介绍   java并发性和多线程介绍: 单个程序内运行多个线程,多任务并发运行 多线程优点: 高效运行,多组件并行.读->操作->写: 程序设计的简单性,遇到多问题, ...

  4. Java并发性和多线程介绍

    java并发性和多线程介绍: 单个程序内运行多个线程,多任务并发运行 多线程优点: 高效运行,多组件并行.读->操作->写: 程序设计的简单性,遇到多问题,多开线程就好: 快速响应,异步式 ...

  5. Java高级教程:Java并发性和多线程

    Java并发性和多线程: (中文,属于人工翻译,高质量):http://ifeve.com/java-concurrency-thread-directory/ (英文):http://tutoria ...

  6. Java 并发性和多线程

    一.介绍 在过去单 CPU 时代,单任务在一个时间点只能执行单一程序.之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程.虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个 ...

  7. Java并发编程、多线程、线程池…

    <实战java高并发程序设计>源码整理https://github.com/petercao/concurrent-programming/blob/master/README.md Ja ...

  8. 1、Java并发性和多线程-并发性和多线程介绍

    以下内容转自http://ifeve.com/java-concurrency-thread/: 在过去单CPU时代,单任务在一个时间点只能执行单一程序.之后发展到多任务阶段,计算机能在同一时间点并行 ...

  9. 6、Java并发性和多线程-并发性与并行性

    以下内容转自http://tutorials.jenkov.com/java-concurrency/concurrency-vs-parallelism.html(使用谷歌翻译): 术语并发和并行性 ...

  10. 29、Java并发性和多线程-非阻塞算法

    以下内容转自http://ifeve.com/non-blocking-algorithms/: 在并发上下文中,非阻塞算法是一种允许线程在阻塞其他线程的情况下访问共享状态的算法.在绝大多数项目中,在 ...

随机推荐

  1. 【翻译】从头开始写一个时间序列数据库-Writing a Time Series Database from Scratch

    本文来自: https://fabxc.org/tsdb/, 如翻译有误,请纠正. 我是从事监控工作的.特别是Prometheus, 一个包含自定义的时间序列库以及集成Kuberntes的监控系统. ...

  2. easyui的下拉框combox动态复赋值显示在前端

    editbale:false设置为本输入框禁止编辑

  3. JavaScript基础整理

    在HTML页面中嵌入JavaScript代码的三种方式 1.内嵌 写在<head>标签或<body>标签中 <script> function displayTim ...

  4. sklearn导入模块问题:python ImportError: No module named datasets

    提示无法导入module 问题原因:将文件命名为sklearn.py. 解决方式:将文件命名为其他. 引用: [1] https://stackoverflow.com/questions/49635 ...

  5. win10 win7 环境下 oracle 11g和Plsql的安装、卸载遇到的问题。

    * win7一体机在安装好oracle和PlSQL后,无法连接到orcl数据库,同时也忘记了sys设置的密码.(在这里应注意在安装过程中,应选择统一口令,这里我均设置成了orcl,同时也应该注意在最后 ...

  6. 最小化安装的centos7.5上编译安装git2.19

    VMware Workstation已经采用最小化安装CentOS7,显示版本为CentOS7.5,准备采用yum安装git. 采用yum list git发现可安装的GIT软件包版本1.8.3.1, ...

  7. 黑群晖DS3617xs-DSM6.1.7up3/up2 开启ROOT用户,同时SATA改eSATA,挂载NTFS硬盘设置(二)

    这两天闲来没事在某宝上搞了个黑群晖主机就j1900/4G小主机系统是DCM 6.1.7up3 15284版 网上修改的教程很多,走了好多弯路终于搞定我的黑群NAS,现分享给各位道友,有不足的地方请给位 ...

  8. spring profile

    配置,激活profile. 处理测试环境,开发环境,生成环境的不同配置. Javaeconfig配置Profile @Profile注解指定某个bean属于哪一个profile xml配置Profil ...

  9. c# 字符串中多个连续空格转为一个空格

    #region 字符串中多个连续空格转为一个空格 /// <summary> /// 字符串中多个连续空格转为一个空格 /// </summary> /// <param ...

  10. C#通过COM组件操作IE浏览器(二):使用IHTMLDocument3完成登录

    第一章介绍了如何打开网站,这一章介绍一下使用IHTMLDocument3完成登录博客园,以下为代码: SHDocVw.InternetExplorer oBrowser = new SHDocVw.I ...