JAVA——多线程之基础知识

多线程:

多线程指的是在单个程序中可以同时运行多个同的线程执行不同的任务。可以提前学习操作系统中的相关知识。
Java中如果我们自己没有产生线程,那么系统就会给我们产生一个线程(主线程,main方法就在主线程上运行),我们的程序都是由线程来执行的。

一、线程与进程:

一个应用程序就是一个进程,一个进程有多个线程;
进程独享资源,线程间共享所属进程的资源
线程随着进程的结束而消失
进程间通信非常复杂,线程之间通信简单
多进程的意义:提高CPU的使用率
多线程的意义:提高应用程序的使用率
1)Java程序运行原理
由java命令启动JVM,JVM启动就相当于启动了一个进程,该进程创建了一个主线程去调用main方法。
2)jvm虚拟机的启动时单线程还是多线程?
JVM的启动是多线程的,因为它最低有两个线程启动了,主线程和垃圾回收线程
二、java线程的处理方式
         (一)(实现多线程的方式)都可以使用外部类或匿名内部类在同一个java文件中实现
1、extends Thread:继承线程类,重写run()方法,创建MyThread类对象,启动线程start()
2、implements Runnable: MyThread实现Runnable接口,重写run()方法,创建MyThread类对象,创建Thread类队形,并把MyThread对象作为构造参数传递
          为什么继承接口的方法比较好?
1、可以避免由于Java单继承带来的局限性;
2、适合多个相同程序的代码取处理同一个资源的情况,把线程同程序的代码,数据有效分离,较好的体现了面向对象的设计思想(耦合性若,数据分离);
举例:
继承Thread:MyThread t1=new MyThread();  MyThread t2=new MyThread();  t1.start();t2.start();
实现Runnable:MyRunnable m=new Runnable(); Thread t=new Thread(m);
Thread t2=new Thread(m); t1.start();t2.start();
           (二)中断线程 Thread t=new MyThread();
1、t.stop();  //具有不安全性,不建议使用---让线程停止,全部停止
2、t.interrupt();//终止线程后,抛出InterruptException,然后继续执行后续代码
补充:
1、继承Thread要重写run()方法,为什么呢?
  不是类中的所有代码都需要被线程执行的。java提供了Thread类中run()用来包含那些被线程执行的代码。
2、run():直接调用仅仅是普通方法
start():先启动线程,再有JVM调用run()方法
三、线程
1、分类
1)精灵线程:又称后台线程,守护线程;当其他线程都结束后,精灵线程也跟着结束;如果运行的都是守护线程,则虚拟机直接退出, 该方法必须在启动线程前调用。 怎么标记为守护线程呢 启动前:t.setDaemon(true);
2)主线程:main方法
3)子线程:除main方法外的线程
2、属性
当前执行的线程对象:Thread.currentThread
名字:getName()
id:
线程优先级:getPriority()
线程组:ThreadGroup:
3、线程的调度和优先级问题
A:线程的调度
a:分时调度
b:抢占式调度 (Java采用的是该调度方式)优先级高的先运行,相同则随机
B:获取和设置线程优先级
a:默认是5
b:范围是1-10
四、线程生命周期
1、状态
新建:创建程序对象
就绪:有执行资格,没有执行权
运行:有执行资格,有执行权
阻塞:由于一些操作让线程阻塞,没有执行资格,没有执行权
另一些操作让它激活后,处于就绪状态
死亡:线程对象变成垃圾,等待回收
2、画图


五、如何控制线程运行
1、sleep:睡眠
2、join:在一个线程中调用另一个线程的join 则当前的线程阻塞,另一个线程先执行,执行完后才执行当前进程——相当于——单进程
3、yield:
sleep与yield:
1)相同:
Thread类的静态方法,都会使当前的线程放弃CPU,
2)差别:yield让出后是就绪状态也有可能会执行
yield只会把CPU让给相同或更高优先级的线程;直接转入就绪状态,不会抛出异常
sleep就是让出去; sleep后转入阻塞再就绪,会抛出异常
4、synchronized
synchronized(对象){需要同步的代码;}
同步可以解决安全问题的根本原因就在那个对象上。该对象如同锁的功能。要求:多个线程必须是使用同一个对象锁
同步的好处:同步的出现解决了多线程的安全问题。

同步的弊端:当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率。
5、优先级:setProperty(" "); 1-10 优先级越大,执行的几率越大;
七、死锁---果出现了同步嵌套,就容易产生死锁问题
1、什么是死锁
指两个或以上的进程在执行过程中,由于竞争资源或者由于批次通信而造成的而一种阻塞的现象,//若干个资源循环等待资源而造成阻塞的情况(是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象)
2、死锁的四个条件
互斥:一个资源只能被一个进程使用
循环等待:若干进程间头尾相接的循环等待资源关系
不剥夺条件:进程资源在未使用完之前,不会强行被剥夺
请求与保持:因请求资源而阻塞时,也不会放弃已有的资源
八、线程间通信---针对同一个资源的操作有不同种类的线程
--生产者与消费者----解决死锁
九、线程组
Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制。 默认情况下,所有的线程都属于主线程组。
public final ThreadGroup getThreadGroup() 我们也可以给线程设置分组 Thread(ThreadGroup group, Runnable target, String name) 十、线程池
程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。
线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。
在JDK5之前,我们必须手动实现自己的线程池,从JDK5开始,Java内置支持线程池
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值