java的线程与进程

本文详细介绍了Java中多线程的概念、实现方法及其状态转换等内容。对比了进程与线程的区别,并介绍了两种实现多线程的方式:继承Thread类与实现Runnable接口。此外,还讲解了线程的调度方法及生命周期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   java是少数的几种支持"多线程"的语言之一。大多数的程序语言智能循环运行单独一个程序块,但无法同时运行不同的多个程序块。java的"多线程"恰好可以弥补这个缺憾,它可以让不同的程序块一起运行,如此一来可让程序运行更为顺畅。

首先,我们来了解一下进程和线程的区别

进程:

1.在操作系统中进程是进行系统资源分配、调度和管理的最小单位,进程在执行过程中拥有独的内存单元。

2.每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1~n个线程。

线程:

1.操作系统是以进程为单位,而进程是以线程为单位的,进程中必须有一个主线程main。

2.同意一线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。

多线程:是指在同一程序中有多个顺序流在执行。

多进程:是指操作系统能同时运行多个任务(程序)。


第二、实现多线程的方法:继承Thread类、实现Runnable接口。

实现Runnable接口:可以实现接口,也可以匿名实现接口

1.定义一个类,实现Runnable接口,实现接口的run()方法,run()方法内部定义多线程要运行的代码。

2.创建一个Runnable接口实现类的对象。

3.创建一个Thread类的对象,用刚才Runnable接口实现类对象作为构造函数参数。

4.调用Thread对象的start()方法来启动线程。

class 类名称implements Runnable  // 实现Runnable接口

{

    属性

    方法…

    修饰符run(){      

      // 复写Thread类里的run()方法 以及线程处理的程序;

    }

}

多线程的启动方式:new Thread(Runnable实现类对象).start();



继承Thread类:

1.定义一个类使之继承Thread类。

2.复写Thread类的public void run()方法,需要多线程处理的代码必须写在run()方法内部。

多线程的定义语法:

修饰符  class 类名称extends Thread  // Thread类扩展出子类

{

    属性

    方法…

    public void run(){    // 覆写Thread类里的run()方法

    线程处理的程序;

    }

}

启动多线线程的方式:    new 线程类名().start();

注意:

启动多线程必须是通过线程类的对象来调用start()方法。

不能直接调用run()方法,如果直接调用run()则仍然是单线程,没有启动多线程。

通过调用start()方法,启动一个子线程,子线程会直接运行run()方法内的代码。

两种机制的比较:

1.继承Thread:

缺点:不能再从其他类继承。

优点:编写和操作简单可以直接操纵线程。

2.实现Runnable:

优点:

适合多个相同的程序代码去处理同一个资源。

可以避免java的单继承的限制。

增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。


*线程Thread类的一些方法
public void start();//开始执行线程
public staticThread currentThread()    //返回当前正在执行的线程对象的引用
public ClassLoader getContextClassLoader()    //返回该线程的上下文ClassLoader
public final boolean isAlive()    //测试线程是否处于活动状态
public Thread State getState()    //返回该线程的状态
public final String getName()    //返回该线程的名字
public final void setName(String name)    //改变线程的名字
public final void setDaemon(boolean on)    //将该线程标记为守护线程或用户线程


*线程的调度
1.线程的睡眠:Thread.sleep(long millis)throws interrupttedException
    注意:该方法是静态方法,在哪个线程内部调用 sleep()方法就是使线程进入休眠,使该线程处于阻塞状态.

2.线程的礼让:Thread.yield()
让出更多的CPU时间片给其他更有价值的线程,减少本线程的占用时间.
    注意:完全有一种可能,该线程暂停之后又马上获得运行机会.

3.线程的加入:join() throws InterrupttedException
        Thread 对象.join();---谁调谁霸道,必须先运行完,别人才能运行.
        Thread 对象.join(long 毫秒数);---谁调谁霸道,阻断别人 "毫秒".
在当前线程中调用另一个线程的join方法,则当前线程转入WAITING状态,直到另一个线程运行结束,当前线程再由阻塞转为就绪状态.阻碍宿主线程的运行,谁启动它,就将阻碍谁...

4.interrupt()---"线程自我中断",但如果当前线程有sleep()的前后调用,则会引发InterruptedException.如果想要退出Interrupt,那么必须是引发异常才能退出.

5.线程的停止:
a.如果线程的run()方法中执行的是一个重复执行的循环,可以提供一个标记来控制循环是否执行.
b.如果线程因为执行sleep()或是wait()而进入了阻塞状态,此时要想停止它,可以使用Interrupt(),程序会抛出InterruptedException异常而离开run()方法.
c.如果程序因为输入/输出的等待而阻塞,基本上必须等待输入/输出的动作完成才能离开阻塞状态.无法用 Interrupt() 方法来使得线程俩开 run() 方法,要想离开,值能通过引发一个异常.


线程和进程一样分为5个阶段:创建(NEW)、就绪(WAITING)、运行(RUNNABLE)、阻塞(BLOCKED)、终止(TERMINATED)。
a.创建(NEW):新创建了一个线程对象.

b.就绪(WAITING):
    线程对象创建后,其他线程调用了该对象的start()方法,在run()方法之前的状态。
    该状态的线程位于可运行线程池里,变的可运行,等待获取CPU的使用权.
    获取了CPU,执行程序代码时也属于就绪状态.

c运行状态(RUNNABLE): 执行run().

d.阻塞状态(BLOCKED):
  阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
     (被动)同步阻塞:若该同步锁定被别的线程占用,则JVM会把该线程放入锁池中。运行的线程再获取对象的同步锁时。
     等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
     主动阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时,或者I/O处理完毕时,线程重新转入就绪状态。

e.结束状态(TERMINATED): 线程执行完了或者因异常退出了run()方法,该线程结束生命周期

四、线程的优先级:(1~10)
三个静态常量:
static int MAX_PRIORITY = 10;
static int NORMAL_PRIORITY = 10;
static int MIN_PRIORITY = 10;
Thread.getPriority();//获取线程的优先级
Thread.setPriority();//设置线程的优先级

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值