java 多线程一

java 多线程二

java 多线程三

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 多线程一的更多相关文章

  1. JAVA多线程一

    介绍 线程是操作系统的最小单位,一个进程可以创建多个线程. 线程有五种状态,分别是新建.就绪.运行.阻塞.死亡状态. 多线程可以提高执行效率,但是如果单线程可以完成的任务,使用多线程反而会增加不必要的 ...

  2. 深入java多线程一

    涉及到 1.线程的启动(start) 2.线程的暂停(suspend()和resume()) 3.线程的停止(interrupt与异常停止,interrupt与睡眠中停止,stop(),return) ...

  3. (三十)java多线程一

    我们通常在电脑中打开的应用称作进程,一个应用就是一个进程,而一个进程里边一般包含多个线程. 系统要为每一个进程分配独立的内存空间,而进程里的多个线程共用这些内存. 我们通常所写的main方法就是一个线 ...

  4. Java多线程之ConcurrentSkipListMap深入分析(转)

    Java多线程之ConcurrentSkipListMap深入分析   一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下, ...

  5. 用“逐步排除”的方法定位Java服务线上“系统性”故障(转)

    一.摘要 由于硬件问题.系统资源紧缺或者程序本身的BUG,Java服务在线上不可避免地会出现一些“系统性”故障,比如:服务性能明显下降.部分(或所 有)接口超时或卡死等.其中部分故障隐藏颇深,对运维和 ...

  6. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  7. JAVA多线程之volatile 与 synchronized 的比较

    一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...

  8. java多线程之yield,join,wait,sleep的区别

    Java多线程之yield,join,wait,sleep的区别 Java多线程中,经常会遇到yield,join,wait和sleep方法.容易混淆他们的功能及作用.自己仔细研究了下,他们主要的区别 ...

  9. Java多线程之Runnable与Thread

    Java多线程之Thread与Runnable 一.Thread VS Runnable 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类和 ...

随机推荐

  1. Java中子类和父类相关方法的执行顺序

    无意中看到下面一个题目,大家一起来看看最后的输出结果是什么.反正我看完之后,用IDE测试后感觉知识点得到巩固了. /** * 函数执行顺序测试 * Created by 萌小Q on 2017/5/1 ...

  2. Android 安装 卸载 更新 程序

    安装程序的方法: .通过Intent机制,调出系统安装应用,重新安装应用的话,会保留原应用的数据. 1. String fileName =Environment.getExternalStorage ...

  3. 洛谷 P3253 [JLOI2013]删除物品 解题报告

    P3253 [JLOI2013]删除物品 题目描述 箱子再分配问题需要解决如下问题: (1)一共有\(N\)个物品,堆成\(M\)堆. (2)所有物品都是一样的,但是它们有不同的优先级. (3)你只能 ...

  4. Java NIO -- 阻塞和非阻塞

    传统的 IO 流都是阻塞式的.也就是说,当一个线程调用 read() 或 write()时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务.因此,在完成网络通信进行 IO操作 ...

  5. 在Sqlite中通过Replace来实现插入和更新

      你可能在批量处理一个事务的时候,想要批量插入一系列的数据,但是这些数据当添加完一次之后,重新添加的时候,你不想要重新添加,只是想将原有的数据进行更新,例如:我想要通过Excel将一系列的图书导入到 ...

  6. forEach、for、$.each()跳出循环比较

    无论工作上或是学习上,用过的知识点总是容易忘记,于是略作记录,方便你我他. 说起跳出循环,第一时间想起的是 break \ continue,这是经典的for循环. 1.for 循环 先上例子,思考输 ...

  7. 【洛谷P1486】郁闷的出纳员

    题目大意:维护一个平衡树,支持插入一个数,删除小于一个值的所有数,K 大值查询,每个节点权值加减一个数. 题解:所有节点权值加减操作可以考虑直接维护一个全局标记,删除小于一个值的所有数字为一个二分的过 ...

  8. hibernate中复合主键的使用

    转: https://blog.csdn.net/shutingwang/article/details/6627730 https://blog.csdn.net/lmy86263/article/ ...

  9. 让maven项目使用nexus作为远程仓库

    让maven项目使用nexus作为远程仓库有两种方式,第一种是在项目的pom.xml中进行更改,让单个项目使用nexus仓库:另一种是通过修改maven的配置文件settings.xml进行更改,让所 ...

  10. Mysql跨表更新

    Mysql跨表更新一直是大家所关心的话题,本文介绍mysql多表 update在实践中几种不同的写法,需要的朋友可以参考下 假定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Pr ...