java 多线程基础

简介: java 多线程基础

1.继承Runnable接口

package com.vince.xq.kafka.thread;
public class ThreadOne implements Runnable {
    private int i;
    public ThreadOne(int i) {
        this.i=i;
    }
    @Override
    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(i);
    }
}

使用

package com.vince.xq.kafka;
import com.vince.xq.kafka.thread.ThreadOne;
public class TestThread {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            Thread thread = new Thread(new ThreadOne(i));
            thread.start();
        }
    }
}

结果

2.继承Thread 类

package com.vince.xq.kafka.thread;
public class ThreadTwo extends Thread {
    private int i;
    public ThreadTwo(int i){
        this.i=i;
    }
    @Override
    public void run() {
        System.out.println(i);
    }
}

使用

package com.vince.xq.kafka;
import com.vince.xq.kafka.thread.ThreadTwo;
public class TestThread {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            Thread thread = new ThreadTwo(i);
            thread.start();
        }
    }
}

结果

3.继承callable接口

package com.vince.xq.kafka.thread;
import java.util.concurrent.Callable;
public class ThreadThree implements Callable<String> {
    @Override
    public String call() {
        try {
            int x = 10 / 1;
            return "test";
        } catch (Exception e) {
            e.printStackTrace();
            return "0";
        }
    }
}

使用

package com.vince.xq.kafka;
import com.vince.xq.kafka.thread.ThreadThree;
import java.util.concurrent.*;
public class TestThread {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>());
        FutureTask<String> futureTask = new FutureTask<>(new ThreadThree());
        threadPoolExecutor.submit(futureTask);
        System.out.println(futureTask.get());//主线程等子线程结束
        threadPoolExecutor.shutdown();
    }
}

4.主线程等子线程结束实现方法

(1)Future.get()

        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>());
        FutureTask<String> futureTask = new FutureTask<>(new ThreadThree());
        threadPoolExecutor.submit(futureTask);
        System.out.println(futureTask.get());//主线程等子线程结束
        threadPoolExecutor.shutdown();

(2)CountDownLatch

package com.vince.xq.kafka;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
public class TestThread {
    public static void main(String[] args) throws InterruptedException {
        long startTime = System.currentTimeMillis();
        CountDownLatch countDownLatch = new CountDownLatch(2);
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        executorService.execute(()-> {
            try {
                test1(countDownLatch);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        executorService.execute(()-> {
            try {
                test2(countDownLatch);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        executorService.shutdown();
        countDownLatch.await();
        System.out.println("0000");
        System.out.println("costTime:");
        System.out.println(System.currentTimeMillis() - startTime);
    }
    public static void test1(CountDownLatch countDownLatch) throws InterruptedException {
        Thread.sleep(2000);
        System.out.println(111);
        countDownLatch.countDown();
        //return "111";
    }
    public static void test2(CountDownLatch countDownLatch) throws InterruptedException {
        Thread.sleep(2000);
        System.out.println(222);
        countDownLatch.countDown();
    }
    public static String test3() throws InterruptedException {
        Thread.sleep(2000);
        return "333";
    }
}
class MyUncaughtExceptionHandle implements Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("caught " + e);
    }
}
class HandleThreadFactory implements ThreadFactory {
    @Override
    public Thread newThread(Runnable r) {
        System.out.println("create thread t");
        Thread t = new Thread(r);
        System.out.println("set uncaughtException for t");
        t.setUncaughtExceptionHandler(new MyUncaughtExceptionHandle());
        return t;
    }
}

(3)Thread.join()

long startTime = System.currentTimeMillis();
Thread thread = new Thread(new ThreadOne("1"));
thread.start();
//thread.join();
long costTime = System.currentTimeMillis() - startTime;
System.out.println("costTime:" + costTime);
package com.vince.xq.kafka.thread;
import java.util.concurrent.atomic.AtomicBoolean;
public class ThreadOne implements Runnable {
    private static AtomicBoolean exists = new AtomicBoolean(false);
    private String name;
    public ThreadOne(String i) {
        this.name = i;
    }
    @Override
    public void run() {
        if (exists.compareAndSet(false, true)) {
            System.out.println(name + "start");
            try {
                Thread.sleep(6000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            exists.set(false);
            System.out.println("111111");
        } else {
            System.out.println(name + " give up");
        }
    }
}

没有thread.join

有thread.join

5.java 守护线程

java并发编程学习: 守护线程(Daemon Thread)

一个线程去执行数据,一个线程设置为守护线程去打印日志


相关文章
|
18天前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
83 1
|
18天前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
72 1
|
1月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
97 0
|
1月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
139 16
|
2月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
2月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
3月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
323 83
|
3月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
161 0
|
3月前
|
存储 Java 调度
Java虚拟线程:轻量级并发的革命性突破
Java虚拟线程:轻量级并发的革命性突破
304 83