java 多线程一
java 多线程实现的几种方式:
1、extends Thread
2、implements Runnable
3、implements Callable<>
下面上代码:
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask; /**
* Created by root on 17-9-30.
*/
public class Test4Thread {
public static void main(String[] args) throws Exception { //**********************
MyThread1 myThread1_1=new MyThread1("myThread1_1");
MyThread1 myThread1_2=new MyThread1("myThread1_2");
MyThread1 myThread1_3=new MyThread1("myThread1_3");
myThread1_1.start();
myThread1_2.start();
myThread1_3.start(); //***********************
MyThread2 myThread2 = new MyThread2();
Thread t2_1 = new Thread(myThread2);
Thread t2_2 = new Thread(myThread2);
Thread t2_3 = new Thread(myThread2);
t2_1.setName("MyThread2_1");
t2_2.setName("MyThread2_2");
t2_3.setName("MyThread2_3");
t2_1.start();
t2_2.start();
t2_3.start(); //**************************
MyThread3 myThread3=new MyThread3();
FutureTask<String> futureTask1=new FutureTask<String>(myThread3);
FutureTask<String> futureTask2=new FutureTask<String>(myThread3);
FutureTask<String> futureTask3=new FutureTask<String>(myThread3);
Thread t3_1 = new Thread(futureTask1);
Thread t3_2 = new Thread(futureTask2);
Thread t3_3 = new Thread(futureTask3); t3_1.setName("MyThread3_1");
t3_2.setName("MyThread3_2");
t3_3.setName("MyThread3_3");
t3_1.start();
t3_2.start();
t3_3.start();
System.out.println(futureTask1.get());
System.out.println(futureTask2.get());
System.out.println(futureTask3.get()); }
} class MyThread1 extends Thread {
int tickets = 5; public MyThread1(String name) {
super(name); } @Override
public void run() {
for (; tickets > 0; ) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + tickets--);
}
}
} class MyThread2 implements Runnable {
int tickets = 5; public void run() {
for (; tickets > 0; ) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + tickets--);
}
}
} class MyThread3 implements Callable<String> { int tickets=5;
public String call() throws Exception {
for (; tickets > 0; ) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + tickets--);
}
return Thread.currentThread().getName() + ":" +"卖完了";
}
}
运行结果:
myThread1_1:5
myThread1_2:5
myThread1_3:5
myThread1_1:4
myThread1_3:4
myThread1_2:4
myThread1_1:3
myThread1_2:3
myThread1_3:3
myThread1_1:2
myThread1_3:2
myThread1_2:2
myThread1_1:1
myThread1_3:1
myThread1_2:1
MyThread2_1:5
MyThread2_2:5
MyThread2_3:4
MyThread2_1:3
MyThread2_2:2
MyThread2_3:1
MyThread2_1:0
MyThread2_2:-1
MyThread3_1:5
MyThread3_2:4
MyThread3_3:3
MyThread3_1:2
MyThread3_2:1
MyThread3_1:卖完了
MyThread3_2:卖完了
MyThread3_3:0
MyThread3_3:卖完了
可以看到,后在需要实现多线程操作公工数据时最好用Runable 、Callable接口的方式,当然也可以用Thread (类似Runable的方式实现)。
java 多线程一的更多相关文章
- JAVA多线程一
介绍 线程是操作系统的最小单位,一个进程可以创建多个线程. 线程有五种状态,分别是新建.就绪.运行.阻塞.死亡状态. 多线程可以提高执行效率,但是如果单线程可以完成的任务,使用多线程反而会增加不必要的 ...
- 深入java多线程一
涉及到 1.线程的启动(start) 2.线程的暂停(suspend()和resume()) 3.线程的停止(interrupt与异常停止,interrupt与睡眠中停止,stop(),return) ...
- (三十)java多线程一
我们通常在电脑中打开的应用称作进程,一个应用就是一个进程,而一个进程里边一般包含多个线程. 系统要为每一个进程分配独立的内存空间,而进程里的多个线程共用这些内存. 我们通常所写的main方法就是一个线 ...
- Java多线程之ConcurrentSkipListMap深入分析(转)
Java多线程之ConcurrentSkipListMap深入分析 一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下, ...
- 用“逐步排除”的方法定位Java服务线上“系统性”故障(转)
一.摘要 由于硬件问题.系统资源紧缺或者程序本身的BUG,Java服务在线上不可避免地会出现一些“系统性”故障,比如:服务性能明显下降.部分(或所 有)接口超时或卡死等.其中部分故障隐藏颇深,对运维和 ...
- JAVA多线程之wait/notify
本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...
- JAVA多线程之volatile 与 synchronized 的比较
一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...
- java多线程之yield,join,wait,sleep的区别
Java多线程之yield,join,wait,sleep的区别 Java多线程中,经常会遇到yield,join,wait和sleep方法.容易混淆他们的功能及作用.自己仔细研究了下,他们主要的区别 ...
- Java多线程之Runnable与Thread
Java多线程之Thread与Runnable 一.Thread VS Runnable 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类和 ...
随机推荐
- log4net 单独项目
首先参考:http://blog.csdn.net/feiying008/article/details/45440547 有时,我们需要将日志功能作为单独模块,用来以后嫁接到其他项目. 今天就来看看 ...
- 概率dp总结 正在更新
借bin神一句话 概率DP主要用于求解期望.概率等题目. 转移方程有时候比较灵活. 一般求概率是正推,求期望是逆推.通过题目可以体会到这点. 先推公式 多个 -> 一个 明确dp[i]代表什么意 ...
- HDU - 1160 (FatMouse's Speed )最长上升子序列
题意:一个元素有两个属性 w 和 sp 求在w严格递增的情况下 sp严格递减 用结构体 定义三个参数 w sp ix , ix是在输入时的顺序 因为我们要排序 之后把结构体数组 按从小到大排序 ...
- HSQL可视化工具
本地使用HSQL数据库进行开发,多是集成在开发工具的内部,比如studio,往往看不到HSQL数据库,那么如何查看HSQL数据库呢? 可以使用hsql自带的可视化工具,运行hsqldb-*.jar 包 ...
- 【题解】 bzoj3956: Count (ST表+单调栈)
题面 Solution 看了一点点题解,自己又刚了\(2h30min\),刚了出来qwq,我好菜啊qwq 貌似这道题是BZOJ 4826的弱化,弱化都不会qwq凉凉 Solution 首先你可以考虑, ...
- onTouchEvent方法的使用
手机屏幕事件的处理方法onTouchEvent.该方法在View类中的定义,并且所有的View子类全部重写了该方法,应用程序可以通过该方法处理手机屏幕的触摸事件.该方法的签名如下所示. public ...
- GNOME Shell Extension常用扩展
这篇博文的,主要目的是为了方便我和大家安装GNOME扩展.我将我安装过的所有扩展列在此处. 常用扩展 Clipboard Indicator https://extensions.gnome.org/ ...
- 第一次使用Android Studio时你应该知道的一切配置(一)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- 【小白技术笔记】保存皮皮虾APP无水印视频到手机相册,只需要三步 [技术干货]
百万段友回皮皮虾,转身一变,都成了皮友.作为当年的资深段友,今天的皮友的我.看到好视频,经典视频,搞笑视频,就想保存一份到手机相册,然后皮皮虾啊皮皮虾,有个让人很讨厌的地方,保存视频的时候就有皮皮虾的 ...
- Hive记录-Hive on Spark环境部署
1.hive执行引擎 Hive默认使用MapReduce作为执行引擎,即Hive on mr.实际上,Hive还可以使用Tez和Spark作为其执行引擎,分别为Hive on Tez和Hive on ...