JAVA线程学习

1.java线程的概念

1.1认识线程计算机的操作系统多采用多任务和分时设计,多任务指的是在一个操作系统中可以运行多个程序,例如,可以在使用qq聊天的时候同时听音乐,即有多个独立运行的任务,每个任务代表一个线程,每个进程又可以产生多个线程.

1.2进程就是运行中的程序(进驻在内存中的)

  • 是系统执行资源分配和调度的独立单位

  • 每一进程都有属于自己的存储空间和系统资源

  • 注意:进程A和进程B的内存独立不共享

1.3线程就是进程中的单个顺序控制流,也可以理解为一条执行路径

单线程:一个进程中包含一个顺序控制流(一条执行路径)

多线程:一个进程中包含多个顺序控制流(多条执行路径)

1.4java中线程状态

 新生状态

创建完线程对象后,尚未调用start()方法,这个线程就有了生命,此时线程只是一个新对象,系统还没给其分配资源,此时只能启动或终止线程,其他任何操作都会引发异常.

可运行状态

当调用start()方法启动线程后,系统为该线程分配除cpu外所需的其他资源,这个线程就有了运行的机会,线程处于可运行的状态,在这个状态中,该线程对象可能正在运行,也可能尚未运行,对于一个cpu的机器而言,任何时刻只能有一个可处于运行状态的线程占用处理机,获得cpu资源,此时系统真正运行的是线程的run()方法.

阻塞状态

一个正在运行的线程因为某种原因不能继续运行时,进入阻塞状态,阻塞状态是一种不可运行的状态,而这种状态的线程在得到一个特定的事件后会转回可运行的状态.导致阻塞的原因可能有1.调用了Thread类的静态方法sleep()2.一个线程执行到一个I/O操作时,如果I/O操作尚未完成,该线程会被阻塞.3.如果一个线程的执行需要得到另一个对象的锁,而这个对象的锁被其他线程占用,那么此线程将被阻塞4.线程的suspend()方法被调用导致线程被挂起时,线程进入阻塞状态,但是suspend()方法容易导致死锁,基本不再使用.

死亡状态

一个线程的run()方法运行完毕,stop()方法被调用或者在运行过程中出现未捕获的异常时,线程进入死亡状态.

 

2.串行和并行区别(start和run的区别)

start()方法是并行的,run()方法是串行的.

start()方法进行了线程切换,而run()方法必须等待上方代码执行完毕.

start()方法不可以重复调用,run()方法可以重复调用.

start()方法实现了多线程,而run()方法没有实现真正意义上的多线程.

3.创建线程的两种方法

3.1通过继承Thread类来创建线程对象

java提供了很多类来控制和操作线程,创建线程时继承Thread类并重写了其中run()方法,Thread类的run()方法是线程要执行操作任务的方法,所以线程要操作的代码都写在run()方法中,并通过start()方法来启动线程.

3.2使用Runnable接口创建线程

使用继承Thread类创建线程的方法简单明了但是有个缺点,如果定义的类已经继承了其他类则无法继承Thread类(因为java是单继承),使用Runnable接口方法可以解决上述问题.

 

Runnable接口中定义了一个run()方法,即public void run(),一个类可以通过实现其run()方法完成线程的所有活动,已实现的run()方法称为该线程的线程体,任何实现Runnable接口的对象都能成为一个线程的目标对象.下面示例中采用了 Thread thread=new Thread(new MyFirstThread2,String )创建了线程对象.

 3.3总结两种线程的创建方式

两种创建线程的方式有各自的特点和应用领域:直接继承Thread类的方式编写简单,可以直接操作线程,适用于单重继承的情况;实现Runnable接口方式,当一个类继承了其他类时只能使用这个方式创建线程,而且这种方式可以使多个线程之间使用同一个Runnable对象.

4.priority();sleep();join();yield();interrupt();等方法的使用

4.1线程调度

线程调度管理器负责线程排队和在线程之间分配cpu,并按照调度算法进行调度,当线程调度管理器选中某个线程时,该线程获得cpu资源进入运行状态.线程调度是抢占式调度,在执行当前线程过程中如果有个更高优先级的线程进入可运行状态,则这个更高优先级的线程将立即被调度执行.

线程优先级使用1-10表示,10表示优先级最高,默认值是5,每个优先级对应一个Thread类的公用静态常量,例如public static final int NORM_PRIORITY=5;public static final int MIN_PRIORITY=1;public static final int MAX_PRIORITY=10;线程优先级可以使用setPriority(int grade)更改;(调整优先级并不意味一定会被优先实现,而是调度时有更高概率提前抢占到cpu资源).

实现线程调度的方法

join()方法

join()方法可以使当前线程暂停执行,等调用该方法的线程结束后再继续运行本线程.

join()方法有3种重载形式

public final void join();

public final void join(long mills);

public final void join(long mills,int nanos);

sleep()方法

public static void sleep(long mills)

使用sleep()方法可以让当前线程睡眠(停止执行)mills毫秒,线程由运行状态进入不可运行状态,睡眠过后程序会再次进入可运行状态.(阻塞线程运行).

yield()方法

该方法语法格式:public static void yield()

yield()方法可让当前线程暂停执行,允许其他线程执行,但该线程仍处于可运行状态,并不变为阻塞状态,此时系统选择其他相同或更高优先级线程执行,若无其他相同或更高优先级线程,则该线程继续执行.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

地球在逃人员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值