Java多线程

线程的概念(与进程的区别)

进程:每个独立执行的程序,一个应用程序对应一个进程(电脑支持多进程 )。
线程:是一个程序内部的一条执行路径,Java虚拟机允许应用程序并发地运行多个执行路径。是应用程序中的一个功能。
一个进程包含多个线程。
线程和进程的区别:
1)每个进程都有堵路的代码和数据空间(进程上下文),进程间切换开销大。
2)线程:同一进程内的线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。
3)多进程:在操作系统中能同时运行多个任务(程序)
4)多线程:在同一应用程序中多条执行路径同时执行
main方法又叫主线程

创建和启动线程

Java的线程是通过java.lang.Thread类来实现的。
当程序启动时,JVM产生一个main方法即主线程。
创建流程:
1、创建Thread的实例类的对象
2、实现该对象的方法run()为线程体
3、线程要启动,不然会占用空间
第一种创建方式,实现Runnable接口:
1、定义一个类实现Runnable接口。
主要实现Runable接口中的run()方法;它是用来定义线程运行体;
——class imp类 implements Runnable { public void run {…}}
2、创建一个线程实例,将上边类的对象作为参数传递线程内部
——Thread thread1 = new Thread (new imp类());
3、启动
——thread1.start();
第二种创建方式 :继承Thread,并重写run()方法
1、——class ext类 extends Thread { public void run(){…}}
2、创建此线程的类实例并启动:
——ext类 thread1 =new ext类();
3、启动
——thread1.start();
区别:使用实现Runable接口的方式创建线程时可以为相同程序代码的多个线程提供共享的数据。

线程的基本方法

public void start()——使线程开始执行,可以开始,但是等待JVM调用。
public static Thread currentThread()——返回当前执行线程对象的引用
public ClassLoader getContextClassLoader()—返回上下文classloader
——从线程开始到结束的所有信息
public final boolean isAlive()——测试该线程是否处于活动状态
punlic Thread.state getState()——返回线程状态
public final String getName()——放回线程名称
public final void setNAme(String name)——改变线程名称
public final setDaemon(boolean on)—将该线程标记为守护线程或用户线程
为什么需要多线程?
1、提高应用程序响应,给用户快速反应。
2、重分利用计算机的CPU。
线程的分类
用户线程:执行某项任务。
守护线程:垃圾回收器,服务
在Java中用户线程和守护线程可以进行改变。通过setDaemon方法。

线程的状态转换

这里写图片描述
新建状态(new)
——新建了一个线程对象
就绪状态(Runnable)
——线程对象创建后,其他线程调用了该线程对象的start方法。该线程位于运行线程池中,变得可以运行等待CPU使用权。
——获得CPU就处于运行状态
阻塞状态(Blocked)
线程由于某种原因而放弃CPU使用权。暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞情况分为三种:
同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入到锁池中。
等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
其他阻塞:运行线程执行sleep或join方法而导致线程放弃了CPU使用权。或者等待IO请求,JVM将其设为阻塞状态。当sleep超时,join等待线程中止或者超时、或者IO处理完毕时,线程就转入就绪状态。
结束状态(Dead):
线程执行完或者因异常退出了run方法,该线程结束生命周期。

线程的调度和优先级

线程的调度

线程睡眠:
——Thread.sleep(long mills)throws interruptException方法,是线程转到阻塞状态。mills参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。sleep()平台移植性号。
线程让步:
——Thread.yield()方法,暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。
线程加入:
——join()throws interrupdException方法,在当前线程中调用另一个线程的join()方法,则当前线程转入WAITING状态,直到另一个线程运行的结束,当前线程在由阻塞状态转为就绪状态。
线程停止:
——如果线程的run()方法中执行的是一个重复执行的循环,可以提供一个标记来控制循环是否执行。
——如果线程因为执行sleep()或是wait()而进入阻塞状态,此时要想停止它,可能使用interrupt(),程序会抛出interruptException异常而离开run()方法。
——如果程序因为输入/输出的等待而阻塞,基本上必须等待动作完成才能离开阻塞状态。无法用interrupt()方法来是的线程离开run()方法,要想离开,只能通过引发一个异常。

调整线程的优先级

Java提供一个线程调度器;来监控程序中启动后进入就绪状态的所有线程。优先级高的线程会获得较多的运行机会。
——Java线程的优先级用整数表示,取值范文是1~10,Thread类有以下三个静态常量:
static int MAX_PRIORITY 最高优先级,值为10
static int MIN_PRIORITY 最低优先级,值为1
static int NORM_PRIORITY 默认优先级,值为5
Thread类的setPriority()和getPriority()方法分别用来设置和获取线程优先级。

线程同步

在Java语言中,引入对象互斥锁的概念,保证共享数据操作的完整性。对每个对象都应用于一个可成为”互斥锁“的标记,这个标记保证在任一时刻,只能有一个线程访问对象。
关键字synchronized用来与对象的互斥锁练习。当某峰对象用sychronized修饰时,表明对象在任意时刻只能由一个线程访问。
——使用方法:
sychronized(this){
需要同步的代码;
}
同步方法:public synchronized void sale(){…}

——死锁问题

线程间的通信

——生产者、消费者的问题

容器类的线程安全

容器类大多数默认都没有考虑线程安全问题,程序必须自行实现同步以确保共享数据在多线程下存取不会出错:
——可以用synchronized来锁住这个对象
synchronized(list){list.add(…);}
——可以使用java.util.Collection的synchronizedXXX()方法来返回一个同步化的容器对象。
List list=Collections.synchronizedList(new ArrayList());这种方式在迭代时仍要使用synchronized修饰。
——JDK5.0后,新增了java.util.concurrent这个包,其中包含了一些确保线程安全的容器类,如ConcurrentHashMap、CopyOnWriteArrayList、CopyOnWriteArrayListSet,他们在效率与安全性上取的了较好的平衡。

使用Java Timer调度任务

JDK通过java.util.Timer类提供了基本的调度功能,这个类允许调度一个任务(通过java.util.Task子类定义)按任意周期运行。
java.util.Timer类:代表一个计时器
——public void schedule(TimerTask task,long delat, long period)
重复的以固定的延迟时间去执行一个任务
task被安排在延迟delay后执行,执行后每隔period(毫秒)反 复执行。
——public void shceduleatFixedRate(TimerTask task,long delat, long period)
重复以固定的频率去执行一个任务
——public void cancel()
中止此计时器,丢弃所有当前已安排的任务
java.util.Timer.Task抽象类:表示一个计时器任务
——public abstract void run()
此计时器任务要执行的操作
——public boolean cancel()
取消计时器任务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值