一、java多线程简介
1、 线程就是进程中一个负责程序执行的控制单元。一个进程中可以有多个执行路径,一个进程中至少要有一个线程,开启多个线程是为了同时运行多部分代码。每一个线程都有自己运行的内容,这个内容可以称为线程要执行的任务。
优点:解决了多部分同时运行的问题。
弊端:线程太多效率降低。
2、 应用程序的执行都是CPU在做着快速的切换造成的,这个切换是随机的,JVM启动时就启动了多个线程,至少有两个线程可以分析出来。
- 执行main函数的线程:代码都在主函数中
- 负责垃圾回收的线程:在垃圾回收器
3、创建线程的目的:为了开启一条执行路径,去运行指定的代码和其他代码实现同时运行,运行的指定代码,就是这个执行路径的任务。JVM创建的主线程的任务都定义在了主函数当中,而自定义的线程它的任务:Thread类用于描述线程,线程是需要任务的,所以Thread类也对任务的描述,任务就通过Thread类中的run方法体现,run方法就是封装自定义线程运行任务的函数。run方法中定义就是线程要运行的任务代码。
开启线程是为了运行指定的代码,所以只有运行Thread类,并复写run方法,将运行的代码定义在run方法中即可。
二、创建线程的方式
1、步骤一、定义一个类继承Thread类,覆盖Thread类中的run()方法
步骤二、覆盖Thread类中的run方法
步骤三、直接创建Thread的子类对象创建线程
步骤四、调用start()方法开启线程并调用线程的任务run方法执行
Thread t1 = new Thread();
t1.start();//开启线程,调用run方法
调用run和调用start有什么区别?
2、多线程的区分:
可以通过Thread的getName()方法获取线程的名称Thread-;线程在创建的时候就已经完成了名称的定义
获取当前正在运行线程的名字,Thread.currentThread().getName();主线程的名字是main。
CPU的执行资格:可以被CPU处理,在处理队列中排队
CPU的执行权:正在被CPU处理
1、继承Thread类方式的缺点:如果类已经继承,则无法再继承Thread类
2、通过Runnabe接口实现多继承,可以同时实现继承,避免单继承,方便共享资源,同一份资源多个代理访问。
3、java用Thread对象表示一个线程,通过调用一个start()方法启动线程;一个线程对象只能调用一次start()方法;线程的执行代码写在run()方法中;线程调度由操作系统决定,程序本身无法决定调度顺序;Thread.sleep()
可以把当前线程暂停一段时间。
4、Java线程对象Thread
的状态包括:New
、Runnable
、Blocked
、Waiting
、Timed Waiting
和Terminated
;
通过对另一个线程对象调用join()
方法可以等待其执行结束;
可以指定等待时间,超过等待时间线程仍然没有结束就不再等待;
对已经运行结束的线程调用join()
方法会立刻返回。