Java进阶学习——Java多线程知识的理解

Yolanda ·
更新时间:2024-09-20
· 634 次阅读

Java多线程知识的理解0.前言1.从一道题目引入2.创建线程2.1.继承Thread类2.2.实现Runnable接口3.线程的生命周期4.线程安全4.1.为什么需要线程安全?4.2.如何实现线程安全?5.线程池5.1.为什么需要线程池?5.2.创建线程池5.2.1.创建可缓存线程池5.2.2.创建定时周期性的任务执行线程池5.2.3.创建带有返回值的线程池5.2.4.创建ForkJoinPool线程池5.2.4.1.使用invokeall()5.2.4.2.使用fork()5.2.4.3.使用invoke()5.2.5.4运行测试6.本文出现的多线程常见问题解答6.1.为什么主线程早于子线程执行?6.2.synchronized(this)和synchronized(object)什么区别?6.3.scheduleAtFixedRate()和scheduleWithFixedDelay()有什么区别?6.4.join()方法6.5.invokeall()和fork()以及invoke()方法对比7.总结 0.前言

本来大一的时候学过多线程,但受限于当时的理解水平有限,一直对这块不是很熟练,在我深入学习Java的时候,对于多线程有了更深层次的认识,分享于此,与君共勉。

1.从一道题目引入

1)自定义多线程类PrimThread求解整数begin到end之间的素数;
(2)定义主类ForkAndJoin,利用PrimThread创建多个线程求解1到10000000之间的素数和,要求输出计算时间。
简单来说就是通过多个线程同时计算来快速计算素数。文末有直接的代码,本文第六节多线程常见问题的解答。是如果想深入探讨这个题目,可以完整的看完本篇文章。

2.创建线程 2.1.继承Thread类 package excise; /** * @author CoderXshuai */ public class MainTest { public static void main(String[] args) { MyThread myThread1 = new MyThread(); MyThread myThread2 = new MyThread(); myThread1.start(); myThread2.start(); } //为了方便,把内部类设置为静态,可以直接调用,正常情况下不要定义为静态的 static class MyThread extends Thread { @Override public void run() { super.run(); System.out.println("线程" + Thread.currentThread().getName() + "正在运行"); } } }

继承Thread类,重写run()方法。

2.2.实现Runnable接口

Runnale接口内部也是继承自Thread类,而且因为Java的单继承多实现的特性,一般都是实现Runnable接口,然后实现run()方法。代码如下:

package excise; /** * @author CoderXshuai */ public class MainTest { public static void main(String[] args) { Thread thread1 = new Thread(new MyThread()); Thread thread2 = new Thread(new MyThread()); thread1.start(); thread2.start(); } static class MyThread implements Runnable { @Override public void run() { System.out.println("线程" + Thread.currentThread().getName() + "正在运行"); } } } 3.线程的生命周期

在main方法中新建两个MyThread对象,然后分别启动它们,即可在控制台得到
在这里插入图片描述
多运行几次也可能得到
在这里插入图片描述
为什么会有随机出现的顺序?
这点要从线程的生命周期来说
原创文章 18获赞 5访问量 877 关注 私信 展开阅读全文
作者:HandsomeCodeBoy



JAVA 学习 java多线程 线程

需要 登录 后方可回复, 如果你还没有账号请 注册新账号