Java多线程(1):3种常用的实现多线程类的方法
(1) 继承java.lang.Thread类(Thread也实现了Runnable接口)
继承Thread类的方法是比较常用的一种,如果说你只是想起一条线程。没有什么其它特殊的要求,那么可以使用Thread。一般推荐Runable。Thread类实际上也是实现了Runnable接口的类。
class ThreadDemo extends Thread {
private int i = 1;
ThreadDemo(String name) {
this.setName(name);
System.out.println("Creating " + name);
}
@Override
public void run() {
System.out.println("Running " + this.getName());
try {
for (; i <= 5; i++) {
System.out.println("Thread: " + this.getName() + " [" + i + "]");
// Thread.sleep()方法调用目的是不让当前线程独自霸占该进程所获取的CPU资源,以留出一定时间给其他线程执行的机会。
Thread.sleep((int) (Math.random() * 100));
}
} catch (InterruptedException e) {
System.out.println("Thread " + this.getName() + " interrupted.");
}
System.out.println("Thread " + this.getName() + " exiting.");
}
@Override
public void start() {
System.out.println("Starting " + this.getName());
super.start();
}
}
// 程序启动运行main时候,java虚拟机启动一个进程,主线程main在main()调用时候被创建。
// 随着调用ThreadDemo的两个对象的start方法,另外两个线程也启动了,这样,整个应用就在多线程下运行。
public class TestThread {
public static void main(String args[]) {
ThreadDemo t1 = new ThreadDemo("Thread-1");
// start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行是由操作系统决定的。
t1.start();
ThreadDemo t2 = new ThreadDemo("Thread-2");
t2.start();
}
}
(2) 直接实现java.lang.Runnable接口
通过实现Runnable接口,使得该类有了多线程类的特征。run()方法是多线程程序的一个约定。所有的多线程代码都在run方法里面。
在启动的多线程的时候,需要先通过Thread类的构造方法Thread(Runnable target) 构造出对象,然后调用Thread对象的start()方法来运行多线程代码。
如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。
class RunnableDemo implements Runnable {
private int i = 1;
RunnableDemo() {
System.out.println("Creating" + Thread.currentThread().getName());
}
@Override
public void run() {
System.out.println("Running " + Thread.currentThread().getName());
try {
for (; i <= 5; i++) {
System.out.println("Thread: " + Thread.currentThread().getName() + " [" + i + "]");
Thread.sleep((int) (Math.random() * 100));
}
} catch (InterruptedException e) {
System.out.println("Thread " + Thread.currentThread().getName() + " interrupted.");
}
System.out.println("Thread " + Thread.currentThread().getName() + " exiting.");
}
}
public class TestRunnable {
public static void main(String args[]) {
Runnable r1 = new RunnableDemo();
Thread t1 = new Thread(r1);
t1.setName("Thread-1");
t1.start();
Runnable r2 = new RunnableDemo();
Thread t2 = new Thread(r2);
t2.setName("Thread-2");
t2.start();
}
}
package com.mycloud.demo.thread; import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; class CallableDemo implements Callable<String> { private int i = 1; CallableDemo() {
System.out.println("Creating " + Thread.currentThread().getName());
} @Override
public String call() {
System.out.println("Running " + Thread.currentThread().getName());
try {
for (; i <= 5; i++) {
System.out.println("Thread: " + Thread.currentThread().getName() + " [" + i + "]");
Thread.sleep((int) (Math.random() * 100));
}
} catch (InterruptedException e) {
System.out.println("Thread " + Thread.currentThread().getName() + " interrupted.");
return "failed";
}
System.out.println("Thread " + Thread.currentThread().getName() + " exiting.");
return "success";
}
} public class TestCallable { public static void main(String args[]) { ExecutorService ex = Executors.newFixedThreadPool(5);
List<Future<String>> futures = new ArrayList<>();
futures.add(ex.submit(new CallableDemo()));
futures.add(ex.submit(new CallableDemo())); try {
for (Future<String> future : futures) {
System.out.println(future.get());
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
ex.shutdown();
}
}
}
Java多线程(1):3种常用的实现多线程类的方法的更多相关文章
- 用python介绍4种常用的单链表翻转的方法
这里给出了4种4种常用的单链表翻转的方法,分别是: 开辟辅助数组,新建表头反转,就地反转,递归反转 # -*- coding: utf-8 -*- ''' 链表逆序 ''' class ListNod ...
- 23种常用设计模式的UML类图
23种常用设计模式的UML类图 本文UML类图参考<Head First 设计模式>(源码)与<设计模式:可复用面向对象软件的基础>(源码)两书中介绍的设计模式与UML图. 整 ...
- 转载:23种常用设计模式的UML类图
转载至:https://www.cnblogs.com/zytrue/p/8484806.html 23种常用设计模式的UML类图 本文UML类图参考<Head First 设计模式>(源 ...
- Java多线程(二)——常用的实现多线程的两种方式
一.继承Thread类创建线程类 Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例.每个线程的作用是完成一定的任务,实际上就是执行一段程序流即一段顺序执行的代码. ...
- java单例模式(两种常用模式)
单例模式是java中常见的设计模式 特点: 单例类只能有一个实例 单例类必须自己创建自己的唯一实例 单例类必须给所有的其他对象提供这一实例 单例模式是某个类只能有一个实例而且自动实例化并且向整个系统提 ...
- Javascript中两种最通用的定义类的方法
在Javascript中,一切都是对象,包括函数.在Javascript中并没有真正的类,不能像C#,PHP等语言中用 class xxx来定义.但Javascript中提供了一种折中的方案:把对象定 ...
- java开发过程中几种常用算法
排序算法 排序算法中包括:简单排序.高级排序 简单排序 简单排序常用的有:冒泡排序.选择排序.插入排序 冒泡排序代码如下: private static void bubbleSrot(int[] a ...
- 用 Java 实现的八种常用排序算法
八种排序算法可以按照如图分类 交换排序 所谓交换,就是序列中任意两个元素进行比较,根据比较结果来交换各自在序列中的位置,以此达到排序的目的. 1. 冒泡排序 冒泡排序是一种简单的交换排序算法,以升序排 ...
- Java中的几种常用循环
循环的条件 反复执行一段相同或相似的代码 一 for循环 先判断,再执行 代码示例为 ① for (int i = 0; i < args.length; i++) ...
随机推荐
- 关于layui表格渲染templet解析单元格的问题
原文链接:https://blog.csdn.net/wyp_comeon/article/details/81735951关于表格解析自定义单元格的解析参数请先详细查看官方文档:http://www ...
- Python——列表赋值的若干用例
原创声明:本文系博主原创文章,转载或引用请注明出处. 1. 直接赋值 >>> a = [1,2,3,4,5] >>> b = a >>> id(a ...
- Zabbix Server安装指南
监控模板网站 在https://share.zabbix.com/,提供了各种各样的监控模板,可以自行搜索,套用.
- 逻辑卷----LVM的基础和应用
逻辑卷管理器 Logical Volume Manager-------逻辑卷宗管理器.逻辑扇区管理器.逻辑磁盘管理器,是Linux核心所提供的逻辑卷管理(Logical volume managem ...
- buuctf@ciscn_2019_n_1
from pwn import * #io=process('./ciscn_2019_n_1') io=remote('node3.buuoj.cn',28216) io.sendline(0x38 ...
- 创建基本的webpack4.x项目
1.步骤 1)运行npm init -y 快速初始化项目 2)在项目根目录创建src源代码目录和dist产品目录,目录结构 webpack4.x-base |dist |src |index.html ...
- 【模板】OI常用模板(待补充)
//PS:最近修改日期:2017-11-07 20:41:44 首先感觉这种模板类的东西写了还是很有意义的,毕竟时不时的可以拿出来借鉴一下. 现在因为刚开始写这一类的东西,所以说还不是很详细,若有读者 ...
- Lucas(卢卡斯)定理
Lucas定理 对于C(m,n)%P(P是质数)这样的问题,可以通过预处理阶乘和阶乘的逆元,来快速计算.但是当m,n大于P时,就不能保证m,n与P互质了,但不互质的情况下,乘法逆元不存在,此时就需要卢 ...
- 19.Python转义字符及用法
在前面的章节中,我们曾经简单学习过转义字符,所谓转义,可以理解为“采用某些方式暂时取消该字符本来的含义”,这里的“某种方式”指的就是在指定字符前添加反斜杠 \,以此来表示对该字符进行转义. 举个例子, ...
- 突破大文件上传 和内网ip的端口转发
php上传大于2M文件的解决方法 2016年12月11日 :: katelyn9 阅读数 php上传大于2M文件的解决方法 如上传一个文件大于2m往往是上传不成功的解决方法: php.ini里查找 查 ...