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的方式实现)。

时间: 2024-11-05 22:37:32

java 多线程一的相关文章

java多线程一

最近在做代码优化时学习和研究了下JAVA多线程的使用,看了菜鸟们的见解后做了下总结.1.JAVA多线程实现方式JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的. 2.继承Thread类实现多线程继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它

深入java多线程一

涉及到 1.线程的启动(start) 2.线程的暂停(suspend()和resume()) 3.线程的停止(interrupt与异常停止,interrupt与睡眠中停止,stop(),return) 4.线程的优先级(setPriority()) 5.线程安全相关的问题(同步加锁,守护线程) 一.线程与进程 (1) 进程是受操作系统管理的基本运行单位(查看windows的任务管理器的进程更好理解) (2) 线程可以理解为是在进程中独立运行的子任务 单线程与多线程,前者的特点是排队执行,也就是同

JAVA多线程之wait/notify

本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait() 与  notify/notifyAll() 的执行过程 ③中断 调用wait()方法进入等待队列的 线程 ④notify 通知的顺序不能错 ⑤多线程中测试某个条件的变化用 if 还是用 while? ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 wait()

Java多线程之wait(),notify(),notifyAll()

在多线程的情况下,因为同一进程的多个线程共享同一片存储空间,在带来方便的同一时候,也带来了訪问冲突这个严重的问题.Java语言提供了专门机制以解决这样的冲突,有效避免了同一个数据对象被多个线程同一时候訪问. wait与notify是java同步机制中重要的组成部分.结合与synchronizedkeyword使用,能够建立非常多优秀的同步模型. synchronized(this){ }等价于publicsynchronized void method(){.....} 同步分为类级别和对象级别

java多线程之ThreadLocal

ThreadLocal保证数据同步 package Thread.Common; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; class Accessor implements Runnable { private final int id; pub

java多线程之Future和FutureTask

Executor框架使用Runnable 作为其基本的任务表示形式.Runnable是一种有局限性的抽象,然后可以写入日志,或者共享的数据结构,但是他不能返回一个值. 许多任务实际上都是存在延迟计算的:执行数据库查询,从网络上获取资源,或者某个复杂耗时的计算.对于这种任务,Callable是一个更好的抽象,他能返回一个值,并可能抛出一个异常.Future表示一个任务的周期,并提供了相应的方法来判断是否已经完成或者取消,以及获取任务的结果和取消任务. public interface Callab

Java多线程之Wait()和Notify()

1.Wait()和Notify.NotifyAll都是Object的方法 2.多线程的协作是通过控制同一个对象的Wait()和Notify()完成 3.当调用Wait()方法时,当前线程进入阻塞状态,直到有另一线程调用了该对象的Notify()方法 package Thread.Wait; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.con

Java多线程之notifyAll的作用域

notifyAll()因某个特定锁而被调用时,只有等待这个锁的任务才会被唤醒. package Thread.Wait; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; class Blocker { synchronized void waitingCall() { try

Java多线程之join

将另外一个线程join到当前线程,则需要等到join进来的线程执行完才会继续执行当前线程. package Thread.join; class Sleeper extends Thread { private int duration; public Sleeper(String name, int sleepTime) { super(name); duration = sleepTime; start(); } public void run() { try { sleep(duratio