我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java多线程基础知识点有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java多线程基础知识点有哪些

这篇文章主要为大家展示了“Java多线程基础知识点有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java多线程基础知识点有哪些”这篇文章吧。

一、线程

什么是线程:

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

什么是多线程:

多线程指在单个程序中可以同时运行多个不同的线程执行不同的任务。

二、创建多线程的方式

多线程的创建方式有三种:ThreadRunnableCallable

1、继承Thread类实现多线程

  Thread thread = new Thread() {            @Override            public void run() {                super.run();                while (true) {                    try {                        Thread.sleep(500);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    System.out.println("1:" + Thread.currentThread().getName());                    System.out.println("2:" + this.getName());                }            }        };        thread.start();

2、实现Runnable接口方式实现多线程

Thread thread1 = new Thread(new Runnable() {            @Override            public void run() {                while (true) {                    try {                        Thread.sleep(500);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    System.out.println("3:" + Thread.currentThread().getName());                }            }        });        thread1.start();

3、Callable接口创建线程

public class CallableTest {    public static void main(String[] args) {        System.out.println("当前线程是:" + Thread.currentThread());        Callable myCallable = new Callable() {            @Override            public Integer call() throws Exception {                int i = 0;                for (; i < 10; i++) {                }                //当前线程                System.out.println("当前线程是:" + Thread.currentThread()                        + ":" + i);                return i;            }        };        FutureTask<Integer> fu = new FutureTask<Integer>(myCallable);        Thread th = new Thread(fu, "callable thread");        th.start();        //得到返回值        try {            System.out.println("返回值是:" + fu.get());        } catch (Exception e) {            e.printStackTrace();        }    }}

当前线程是:Thread[main,5,main]
当前线程是:Thread[callable thread,5,main]:10
返回值是:10

总结:

实现Runnable接口相比继承Thread类有如下优势:

  • 可以避免由于Java的单继承特性而带来的局限;

  • 增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的;

  • 适合多个相同程序代码的线程区处理同一资源的情况。

实现Runnable接口和实现Callable接口的区别:

  • Runnable是自从java1.1就有了,而Callable是1.5之后才加上去的

  • Callable规定的方法是call() , Runnable规定的方法是run()

  • Callable的任务执行后可返回值,而Runnable的任务是不能返回值是(void)

  • call方法可以抛出异常,run方法不可以

  • 运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。

  • 加入线程池运行,Runnable使用ExecutorServiceexecute方法,Callable使用submit方法。

三、线程的生命周期与状态

Java多线程基础知识点有哪些

四、线程的执行顺序

Join线程的运行顺序

原理:

1、定时器

import java.util.Timer;import java.util.TimerTask;public class TraditionalTimerTest {    public static void main(String[] args) {//         new Timer().schedule(new TimerTask() {//             @Override//             public void run() {////                 System.out.println("bombing!");//             }//         },10000);        class MyTimberTask extends TimerTask {            @Override            public void run() {                System.out.println("bombing!");                new Timer().schedule(new MyTimberTask(), 2000);            }        }        new Timer().schedule(new MyTimberTask(), 2000);        int count = 0;        while (true) {            System.out.println(count++);            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }}

0
1
bombing!
2
3
bombing!
4
5
bombing!
6
省略...

2、线程的互斥与同步通信

public class TraditionalThreadSynchronized {    public static void main(String[] args) {        new TraditionalThreadSynchronized().init();    }    private void init() {        final Outputer outputer = new Outputer();        new Thread(new Runnable() {            @Override            public void run() {                while (true) {                    try {                        Thread.sleep(10);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    outputer.output("kpioneer");                }            }        }).start();//        new Thread(new Runnable() {//            @Override//            public void run() {////                while (true) {//                    try {//                        Thread.sleep(10);//                    } catch (InterruptedException e) {//                        e.printStackTrace();//                    }//                    outputer.output2("Tom");////                }//            }//        }).start();        new Thread(new Runnable() {            @Override            public void run() {                while (true) {                    try {                        Thread.sleep(10);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    outputer.output3("Jack");                }            }        }).start();    }  static   class Outputer {        public void output(String name) {            int len = name.length();            synchronized (Outputer.class) {                for (int i = 0; i < len; i++) {                    System.out.print(name.charAt(i));                }                System.out.println();            }        }        public synchronized void output2(String name) {            int len = name.length();            for (int i = 0; i < len; i++) {                System.out.print(name.charAt(i));            }            System.out.println();        }      public static synchronized void output3(String name) {          int len = name.length();          for (int i = 0; i < len; i++) {              System.out.print(name.charAt(i));          }          System.out.println();      }    }}

3、线程同步通信技术

子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程有循环100,如此循环50次,请写出程序。

public class TraditionalThreadCommunication {    public static void main(String[] args) {        final Business business = new Business();        new Thread(new Runnable() {                    @Override                    public void run() {                        for (int i = 1; i <= 50; i++) {                            business.sub(i);                        }                    }                }        ).start();        for (int i = 1; i <= 50; i++) {            business.main(i);        }    }}class Business {    private boolean bShouldSub = true;    public synchronized void sub(int i) {        if(!bShouldSub) {            try {                this.wait();            } catch (InterruptedException e) {                e.printStackTrace();            }        }        for (int j = 1; j <= 10; j++) {            System.out.println("sub thread sequece of " + j + ",loop of " + i);        }        bShouldSub = false;        this.notify();    }    public synchronized void main(int i) {        if(bShouldSub) {            try {                this.wait();            } catch (InterruptedException e) {                e.printStackTrace();            }        }        for (int j = 1; j <=100; j++) {            System.out.println("main thread sequece of " + j + ",loop of " + i);        }        bShouldSub = true;        this.notify();    }}

sub thread sequece of 1,loop of 1
sub thread sequece of 2,loop of 1
sub thread sequece of 3,loop of 1
sub thread sequece of 4,loop of 1
sub thread sequece of 5,loop of 1
sub thread sequece of 6,loop of 1
sub thread sequece of 7,loop of 1
sub thread sequece of 8,loop of 1
sub thread sequece of 9,loop of 1
sub thread sequece of 10,loop of 1
main thread sequece of 1,loop of 1
main thread sequece of 2,loop of 1
main thread sequece of 3,loop of 1
main thread sequece of 4,loop of 1
main thread sequece of 5,loop of 1
main thread sequece of 6,loop of 1
main thread sequece of 7,loop of 1
main thread sequece of 8,loop of 1
main thread sequece of 9,loop of 1
main thread sequece of 10,loop of 1
main thread sequece of 11,loop of 1
省略中间...
main thread sequece of 99,loop of 1
main thread sequece of 100,loop of 1
sub thread sequece of 1,loop of 2
sub thread sequece of 2,loop of 2
sub thread sequece of 3,loop of 2
sub thread sequece of 4,loop of 2
sub thread sequece of 5,loop of 2
sub thread sequece of 6,loop of 2
sub thread sequece of 7,loop of 2
sub thread sequece of 8,loop of 2
sub thread sequece of 9,loop of 2
sub thread sequece of 10,loop of 2
main thread sequece of 1,loop of 2
main thread sequece of 2,loop of 2
main thread sequece of 3,loop of 2
省略...

以上是“Java多线程基础知识点有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java多线程基础知识点有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java多线程基础知识点有哪些

这篇文章主要为大家展示了“Java多线程基础知识点有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java多线程基础知识点有哪些”这篇文章吧。一、线程什么是线程:线程是进程的一个实体,是CP
2023-06-25

Java基础知识点有哪些

这篇文章主要介绍“Java基础知识点有哪些”,在日常操作中,相信很多人在Java基础知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java基础知识点有哪些”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-02

Java中的多线程调试基础知识有哪些

今天就跟大家聊聊有关Java中的多线程调试基础知识有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。多线程调试基础  最有价值的调试工具是以线程为中心的。大部分 Java 错误都与
2023-06-03

Java中的基础知识点有哪些

这篇文章主要讲解了“Java中的基础知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中的基础知识点有哪些”吧!"Hello World!"先来看一个HelloWorld.j
2023-06-02

java基础知识有哪些

这篇文章给大家分享的是有关java基础知识有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.java基础1.1Java历史Java:由Sun Microsystems公司于1995年5月推出的Java程序设
2023-06-20

有哪些Java基础知识

本篇内容介绍了“有哪些Java基础知识”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 面向对象与面向过程的区别首先面向过程和面向对象的语言没
2023-06-16

Hibernate基础知识点有哪些

这篇文章主要介绍“Hibernate基础知识点有哪些”,在日常操作中,相信很多人在Hibernate基础知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Hibernate基础知识点有哪些”的疑惑有所
2023-06-17

Python基础知识点有哪些

本篇内容主要讲解“Python基础知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python基础知识点有哪些”吧!Python程序文件结构程序→模块→语句→表达式Python的关键要
2023-06-02

VBS基础知识点有哪些

这篇文章给大家分享的是有关VBS基础知识点有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。VBScript(Microsoft Visual Basic Script Editon).,微软公司可视化BASI
2023-06-08

JAVA编程语言的基础知识点有哪些

本篇内容介绍了“JAVA编程语言的基础知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、面向对象的特征有哪些方面1.抽象:抽象就
2023-06-17

XML基础知识点有哪些

本篇内容主要讲解“XML基础知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“XML基础知识点有哪些”吧!XML 被设计用来描述数据,其焦点是数据的内容。XML 被设计用来描述数据,其焦
2023-06-12

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录