Java多线程核心技术-基本介绍及常用Api

多线程优点

使用单线程会有什么情况出现呢?在同一时间只能执行一个任务,CPU利用率大幅度降低
使用多线程可以在同一时间内执行更多不同的项目,系统和CPU的运行效率大大提升。使用多线程就是使用异步。

那么什么时候使用多线程呢?

  1. 出现阻塞,系统中出现阻塞线程,可以使用多线程提高效率
  2. 依赖,当两个业务的执行不会互相依赖时可以使用多线程提高效率,如果互相依赖则可以不使用多线程,按顺序进行业务的执行

使用多线程

每当有一个进程正在运行时至少有一个线程在运行
例如我们常见的psvm

public class Test {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName());
    }
}

就会输出main,这里的main并不是main方法名,而是一个名称为main的线程

那么怎么实现多线程编程

  1. 继承Thread类
  2. 实现Runnable接口

通过我们查看Thread的源码可以得知,Thread类实现了Runnable接口,他们之间具有多态的关系
如果我们通过继承Thread来创建新线程时,最大的局限是不支持多继承,因为Java语言的特点是单根继承,所以为了多继承,可以实现Runnable接口,但这两种方式从创建线程的功能是一样的,没有本质区别

public class MyThread extends Thread{
    @Override
    public void run(){
        super.run();
        System.out.println("MyThread");
    }
}
public class Test {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();//耗时大
        System.out.println("运行结束");//耗时小
    }
}

上面的例子就使用了start()方法启动一个线程,线程启动后会自动调用线程对象的run方法,run()里面就是线程对象要执行的任务,即是线程执行任务的入口

那么为什么start耗时长呢?
因为执行了四个步骤,其中涉及JVM和操作系统

  1. 通过JVM告诉操作系统创建Thread
  2. 操作系统开辟内存并使用windows SDK的createThread()方法来创建Thread线程对象
  3. 操作系统对Thread进行调度,确定执行时机
  4. Thread被成功执行了

但是线程的执行具有随机性,所以使用多线程技术是,代码的运行结果与代码的执行顺序或调用顺序是无关的

查看线程状态

这里提供三种命令

  • jps 查看java进程+jstack.exe
  • jmc.exe
  • jvisualvm.exe

线程的随机性

下面我举一个例子

package randomness;

public class MyThread extends Thread{
    @Override
    public void run(){
        for (int i = 0;i<10000;i++){
            System.out.println("run="+Thread.currentThread().getName());
        }
    }
}
package randomness;

public class Test {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.setName("MyThread");
        myThread.start();//耗时大
        for(int i = 0;i<10000;i++){
            System.out.println("main="+Thread.currentThread().getName());
        }
    }
}

运行后的结果很明显可以看出是随机输出的,这是因为start方法通知了线程规划器。其实就是让系统安排一个时间来随机调用Thread中的run方法,即让线程执行具体的任务,具有随机顺序执行的效果

多线程随机输出的原因是CPU将时间片分给了不同的线程,线程获得时间片后就执行任务,但并不是创建的线程越多,效率就越高,线程数过多反而会让软件的执行效率降低

  • 执行start的顺序不代表线程启动run的顺序

synchronized

共享数据的情况就是多个线程可以访问同一个变量,例如,实现投票功能时,多个线程同时操作同一个人的票数,但是这种时候很容易出现线程不安全,所以我们要加入synchronized关键字,使多个线程以排队的方式进行处理,称同步

  1. 首先要判断run方法有没有被上锁
  2. 必须等其他线程对run调用结束后才能执行run

停止线程

三种方法:

  1. 使用退出标志使线程正常退出
  2. 停止xiancheng可以使用Thread.stop(),但不建议,虽然它可以停止一个线程,但是这个方法不安全,而且是被弃用的
  3. 使用interrupt()中断线程

调用interrupt()仅仅是在线程中做了一个停止的标记,并不是真正停止线程
但是interrupt()和sleep()一起出现就会异常

线程优先级

  • 优先级越高得到的CPU资源较多,优先级分为1~10,优先级越过界限就会抛出异常
  • 线程优先级具有继承性
  • 优先级高的线程大部分先执行完,即CPU尽量将执行资源让给优先级比较高的线程
  • 线程优先级还有随机性,即线程优先级高的线程不一定先执行完

线程类型

守护线程

典型的守护线程是垃圾回收线程,当非守护线程不存在则守护线程随着JVM自动销毁。守护Daemon线程是为其他提供便利服务,最典型的应用就是GC(垃圾回收器)
凡是setDaemon(true)代码并且传入true值的线程才是守护线程,要在start方法前执行,不然会出现异常

用户线程(非守护线程)

API

currentThread()

查看当前线程

isAlive()

测试线程是否处于活动状态,线程已经启动且尚未终止就是活动状态

sleep(long millis)

在指定的时间(毫秒)内让当前线程休眠

StackTraceElement[] getStackTrace()

返回一个表示该线程堆栈跟踪元素数组
返回的第一个元素代表堆栈顶,它是数组中最新的方法调用。最后一个元素代表堆栈底,是该数组中最旧的方法调用

dumpStack()

将当前线程的堆栈信息输出至标准错误流中

Map<Thread,StackTraceElement[]> getAllStackTraces

返回所有活动线程的堆栈跟踪的一个映射,键是线程,值是一个StackTraceElement数组

getId()

获取线程的唯一标识

interrupted()

判断currentThread()是否已经中断,执行后具有清除状态标志值

this.isInterrupted()

判断this关键字所在类的对象是否中断,不清楚状态标志

stop()

删除线程,但容易造成业务处理的不确定性,太暴力了
调用时会抛出java.lang.ThreadDeath异常,此异常不需要显式地捕捉

interrupt()

停止线程
与return;语句结合使用也能停止线程,较抛异常法在代码结构上可以更加方便的停止线程

suspend()

暂停线程

resume()

恢复线程

suspend()与resume()使用不当,极易容易造成公共同步对象被独占,
其他线程无法访问共同同步对象的结果,这两个方法也是作废的

yeild()

放弃当前的CPU,让其他任务去占用CPU执行时间,有可能刚刚放弃,马上就又获得CPU时间片

setPriorty()

设置线程优先级。

setDaemon(true)

设置守护线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Java核心技术》第10版是一本经典的Java编程指南,由Cay S. Horstmann和Gary Cornell共同撰写。该书旨在帮助初学者和有经验的开发人员提高他们的Java编程技能。 这本书首先介绍Java语言的基本概念,包括变量、数据类型、运算符、控制流程等。然后,它深入探讨了面向对象编程的概念,如类、对象、继承、多态等。此外,该书还涵盖了异常处理、输入输出、字符串处理、集合框架等Java核心库的使用。 《Java核心技术》第10版特别强调了Java 8中引入的新特性,如Lambda表达式、函数式接口、流API等。这些新功能使得Java编程更加简洁和高效。 此外,该书还涵盖了Java的网络编程、多线程、GUI编程以及数据库访问等高级主题。它提供了大量的示例代码和练习题,帮助读者巩固所学知识。 总的来说,《Java核心技术》第10版是一本全面而深入的Java编程指南。无论是初学者还是有经验的开发人员,都可以从中学到很多有关Java编程的知识和技巧。这本书的内容丰富,易于理解,是学习Java的一本不可或缺的参考书籍。 ### 回答2: 《Java核心技术》第10版是由Horstmann和Cornell编写的经典Java编程指南。这本书全面而深入地介绍Java的核心概念和关键技术,一直以来都是Java开发者的首选教材。 本书分为两卷,第一卷主要讲解Java的基础知识,包括Java语言基础、面向对象编程、集合框架、Java I/O、并发编程等内容。作者通过易懂的示例和练习题,帮助读者理解和掌握Java基本语法和常用类库,培养良好的编码习惯和思维方式。 第二卷则深入探讨了Java的高级主题,如网络编程、数据库访问、图形用户界面和Web开发等。作者详细介绍Java的各种高级技术和工具,如多线程、网络编程、JDBC、Swing、JavaFX和Servlet等,帮助读者进一步提升Java应用程序的能力和质量。 这本书的特点是内容全面、深入浅出,适合初学者和有一定Java基础的开发者阅读。每个章节都有丰富的实例和练习,读者可以通过动手实践来加深对Java知识的理解和掌握。此外,书中还介绍了一些最佳实践和常见问题的解决方法,帮助读者在应用开发中避免一些常见的陷阱和问题。 总之,《Java核心技术》第10版是一本权威、全面而深入的Java编程指南,无论是初学者还是有经验的开发者,都可以从中获益良多。它不仅帮助读者掌握Java的基础知识和核心技术,还培养了良好的编程思想和实践能力。无论是用于学习还是作为参考资料,这本书都是不可或缺的。 ### 回答3: 《Java核心技术》是一本经典的Java编程技术书籍,第10版是该书的最新版本。该书由Cay S. Horstmann和Gary Cornell合著,致力于帮助读者全面理解和掌握Java语言的基础知识和高级概念。 第10版的《Java核心技术》共分为两个卷,总共包含16章。第一卷主要介绍Java的基础知识,包括基础语法、控制流程、数组、继承、多态、接口和内部类等。此外,还深入讲解了异常处理、泛型、集合框架、并发编程等重要概念和技术。这些内容为Java初学者提供了一个坚实的基础,并帮助他们编写简单的Java应用程序。 第二卷则更加深入地讨论了Java的高级特性和技术。其中,介绍了图形化用户界面(GUI)编程、事件处理、Swing组件、文件I/O、网络编程和数据库连接等。此外,还涉及了Java的XML和Web服务、高级数据库访问、安全性和国际化等主题。 无论是初学者还是有经验的开发者,都可以从《Java核心技术》中获得收益。该书以清晰简洁的语言和丰富的示例代码来解释概念,并提供了大量的实战经验和技巧。每一章都包含练习题和思考题,帮助读者巩固所学知识,并拓展思考能力。此外,该书还提供了丰富的在线资源和补充材料,如示例代码、练习题答案和附加阅读。 总的来说,《Java核心技术》第10版是一本全面而权威的Java编程指南。通过阅读和学习该书,读者可以建立起坚实的Java基础,并掌握高级的编程概念和技术,从而能够编写出高质量的Java应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值