千家信息网

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

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章主要为大家展示了"Java多线程基础知识点有哪些",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Java多线程基础知识点有哪些"这篇文章吧。一、线程
千家信息网最后更新 2025年02月01日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 fu = new FutureTask(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方法。

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

四、线程的执行顺序

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多线程基础知识点有哪些"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

线程 方法 任务 接口 程序 循环 运行 知识 基础 知识点 代码 内容 多个 方式 篇文章 结果 同步 不同 健壮 单位 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 淘宝服务器证书 对网络安全构成威胁的三大要素 安全生产和职业卫生数据库 长虹电视服务器连接不上怎么办 服务器中间继电器接线图 ps5修复数据库 全国股票软件开发排名 深圳阿里云服务器地址 培训数据库月报范文 免费的网络安全知识竞赛题库 excel服务器教程下载 服务器cpu套件是什么意思 网络安全专业考研调剂学校 数据库安全的三个基本要求 我的世界超刺激生存服务器 航海狼人杀为什么总是服务器停止 网络安全监管司法情况 春考计算机网络技术考什么 答辩被问怎么连接数据库的 定西管理软件开发 贵州云服务器有多大云空间 服务器cpu突然飙升又降下来 网络安全与信息技术总结 a7c 影像数据库文件错误 公安局检查网络安全 信息短信服务器发送 关于网络安全管理办法 金山区网络安全审计系统咨询机构 全国计算机大赛网络技术 网络技术应用十进制
0