并发性(concurrency)和并行性(parallel)是两个概念,并行是指在同一时刻,有多条指令在多个处理器上同时执行;并发指在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得宏观上具有多个进程同时执行的效果。

多线程编程优点:

  1. 进程之间不能共享内存,但线程之间共享内存非常容易。
  2. 系统创建线程所分配的资源相对创建进程而言,代价非常小。

Java中实现线程的方式目前有三种:

一:继承Thread类创建线程类

package com.clzhang.sample.thread;

// 通过继承Thread类来创建线程类
public class ThreadByExtends extends Thread {
private int i; @Override
public void run() {
// 当线程类继承Thread类时,直接使用this即可获取当前线程句柄。
// 因此可以直接调用getName()方法返回当前线程的名称。
System.out.println("当前线程名称是:" + getName()); for (; i < 5; i++) {
System.out.println(getName() + ":" + i);
try {
// 保证让别的线程也有执行的机会
Thread.sleep(10);
} catch (InterruptedException e) {
}
}
} public static void main(String[] args) {
// 静态方法没有this,只能通过Thread.currentThread获取当前线程句柄
System.out.println(Thread.currentThread().getName()); // 创建、并启动第一条线程
new ThreadByExtends().start();
// 创建、并启动第二条线程
new ThreadByExtends().start();
}
}

输出:

main
当前线程名称是:Thread-0
Thread-0:0
当前线程名称是:Thread-1
Thread-1:0
Thread-0:1
Thread-1:1
Thread-1:2
Thread-0:2
Thread-1:3
Thread-0:3
Thread-0:4
Thread-1:4

二:实现Runnable接口创建线程类

package com.clzhang.sample.thread;

/**
* 通过实现Runnable接口来创建线程类
* 1.Runnable非常适合多个相同线程来处理同一份资源的情况
* 2.Runnable可以避免由于Java的单继承机制带来的局限
* 3.如果想获取当前线程句柄,只能用Thread.currentThread()方法
*/
public class ThreadByRunnable implements Runnable {
private int i; @Override
public void run() {
System.out.println("当前线程名称是:" + Thread.currentThread().getName()); for (; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i); try {
// 因为sleep是静态方法,所以不需要通过Thread.currentThread()方法获取当前线程句柄
Thread.sleep(10);
} catch (InterruptedException e) {
}
}
} public static void main(String[] args) {
ThreadByRunnable st = new ThreadByRunnable();
new Thread(st, "新线程1").start();
new Thread(st, "新线程2").start();
}
}

输出:

当前线程名称是:新线程1
当前线程名称是:新线程2
新线程2:0
新线程1:0
新线程2:2
新线程1:2
新线程2:3
新线程1:4

三:使用Calable和Future创建具备返回值的线程

package com.clzhang.sample.thread;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask; // 实现Callable接口来实现线程
public class ThreadByCallable implements Callable<Integer> { @Override
public Integer call() {
System.out.println("当前线程名称是:" + Thread.currentThread().getName()); int i = 0;
for (; i < 5; i++) {
System.out.println("循环变量i的值:" + i);
} // call()方法有返回值
return i;
} public static void main(String[] args) {
ThreadByCallable rt = new ThreadByCallable(); // 使用FutureTask来包装Callable对象
FutureTask<Integer> task = new FutureTask<Integer>(rt);
new Thread(task, "有返回值的线程").start();
try {
// 获取线程返回值
System.out.println("子线程的返回值:" + task.get());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}

输出:

当前线程名称是:有返回值的线程
循环变量i的值:0
循环变量i的值:1
循环变量i的值:2
循环变量i的值:3
循环变量i的值:4
子线程的返回值:5

总结

用Runnable与Callable接口的方式创建多线程的特点:

  1. 线程类只是实现了Runnable接口或Callable接口,还可以继承其它类。
  2. 在这种方式下,多个线程可以共享一个target对象,所以非常适合多个线程来处理同一份资源情况。
  3. 如果需要访问当前线程,需要使用Thread.currentThread方法。
  4. Callable接口与Runnable接口相比,只是Callable接口可以返回值而已。

用Thread类的方式创建多线程的特点:

  1. 因为线程已经继承Thread类,所以不可以再继承其它类。
  2. 如果需要访问当前线程,直接使用this即可。

Java:多线程,分别用Thread、Runnable、Callable实现线程的更多相关文章

  1. Java 多线程 socket 取款例子 runnable callable

    socket部分参考 http://blog.csdn.net/kongxx/article/details/7259465 取款部分参考 http://blog.csdn.net/dayday198 ...

  2. Java多线程专题3: Thread和ThreadLocal

    合集目录 Java多线程专题3: Thread和ThreadLocal 进程, 线程, 协程的区别 进程 Process 进程提供了执行一个程序所需要的所有资源, 一个进程的资源包括虚拟的地址空间, ...

  3. Java多线程带返回值的Callable接口

    Java多线程带返回值的Callable接口 在面试的时候,有时候是不是会遇到面试会问你,Java中实现多线程的方式有几种?你知道吗?你知道Java中有可以返回值的线程吗?在具体的用法你知道吗?如果两 ...

  4. java多线程(二)之实现Runnable接口

    一.java多线程方式2: 实现Runnable接口 好处:a. 可以避免由于java单继承带来的局限性. b. 适合多个相同的程序的代码去处理同一个资源的情况, 把线程与程序的代码, 数据有效分离, ...

  5. Java多线程4:Thread中的静态方法

    一.Thread类中的静态方法 Thread类中的静态方法是通过Thread.方法名来调用的,那么问题来了,这个Thread指的是哪个Thread,是所在位置对应的那个Thread嘛?通过下面的例子可 ...

  6. Java 多线程基础(十)interrupt()和线程终止方式

    Java 多线程基础(十)interrupt()和线程终止方式 一.interrupt() 介绍 interrupt() 定义在 Thread 类中,作用是中断本线程. 本线程中断自己是被允许的:其它 ...

  7. “全栈2019”Java多线程第二十二章:饥饿线程(Starvation)详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  8. “全栈2019”Java多线程第十二章:后台线程setDaemon()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  9. java多线程创建-Thread,Runnable,callable和threadpool

    java创建多线程的方式有许多种,这里简要做个梳理 1. 继承Thread类 继承java.lang.Thread类,创建本地多线程的类,重载run()方法,调用Thread的方法启动线程.示例代码如 ...

  10. Java多线程3:Thread中的实例方法

    一.Thread类中的方法调用方式 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: ...

随机推荐

  1. Discuz上传错误

    换了服务器后,上传图片的时候,显示上传100%,然后报错:upload error: 500.怎么回事那? [解决方法] 原来是php上传文件的时候,会首先上传到一个临时目录.如果临时目录没有权限,就 ...

  2. Cocos2d-x 粒子编辑器 Particle Studio 争做 Windows Particle Designer 源代码

    1.Particle Studio介绍 非常早发现一款粒子编辑器叫Particle Designer,不知道为什么它没有Windows版本号. 所以我就在Windows下基于Qt做了一个粒子编辑器.之 ...

  3. C#.NET常见问题(FAQ)-如何把函数名作为参数传递给另一个函数

    在主窗体中使用的还是普通的函数,但是test函数有一个新的参数,就是method   这个method所指向的就是前面委托定义的method     更多教学视频和资料下载,欢迎关注以下信息: 我的优 ...

  4. 如何安装Tomcat

    1 请确认已经安装了JRE或JDK并配置好了环境变量,关于如何配置环境变量,参考我的另一篇文章"WIN7如何配置java环境变量,运行环境.doc" 2 用记事本打开bin目录下的 ...

  5. Python网络编程 - 请求地址上的文件并下载

    我们用到了requests库,由于是第三方的,必须下载 如果是python 2.x用下面命令 pip install requests python 3.x用下面命令 easy_install req ...

  6. 。一个通俗易懂的HMM例子

    原文链接地址:http://www.52nlp.cn/hmm-concrete-example-on-wiki/ Alice 和Bob是好朋友,但是他们离得比较远,每天都是通过电话了解对方那天作了什么 ...

  7. mysqld: unrecognized service

    为了快速搭建了测试环境yum安装了MySQL. 执行 [root@localhost bin]#mysql ERROR 2002 (HY000): Can't connect to local MyS ...

  8. MySQL查看表结构三种方法

    1:desc T1 2:EXPLAIN T1 3:SHOW COLUMNS FROM T1

  9. Windows 无法启动MongoDB服务 错误1067:进程意外终止

    1:Windows 无法启动MongoDB服务 错误1067:进程意外终止 2:解决方法: 进入MongoDB安装目录\data\将此文件夹下的mongod.lock删除(网友提供解决方案,实验之后貌 ...

  10. HDU 4847 陕西邀请赛A(水)

    HDU 4847 Wow! Such Doge! pid=4847" style="">题目链接 题意:给定文本,求有几个doge,不区分大写和小写 思路:水题.直 ...