JAVA课设-多线程

  • 程序,进程,线程的区别
    程序–是指一段静态的代码,指令和数据的有序集合,其本身没有任何运行的含义

    进程–是程序的一次动态执行过程,它对应于从代码加载、执行到执行完毕的一个完整过程

    线程—是比进程更小的执行单位。一个进程在执行的过程中,可以产生多个线程,形成多条执行线索。每条线索,即每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念。

  • 多进程和多线程

  • Thread类的几种方法:

Thread.currentThread( ); //获取当前的线程
name=curr.getName( );   //获取当前线程的名字
p=curr.getPriority( );  //获取当前线程的优先级
currentThread( )//返回当前运行的线程对象,是一个静态的方法。
sleep(int n)  //使当前运行的线程睡n个毫秒,然后继续执行,也是静态方法。
yield()  //使当前运行的线程放弃执行,切换到其它线程,是一个静态方法。
isAlive()  //判断线程是否处于执行的状态,返回值true表示处于运行状态,false表示已停止。
start( )//使调用该方法的线程开始执行。
run( )//该方法由start( )方法自动调用。
stop( )//使线程停止执行,并退出可执行状态。
suspend()://使线程暂停执行,不退出可执行态。
resume( )//将暂停的线程继续执行。
setName(String s)//赋予线程一个名字。
getName( )//获得调用线程的名字。


  • 创建Thread的两种方法:
    1.创建Thread的子类,并覆盖run()方法

     定义Thread类的一个子类。
     定义子类中的方法run( ),覆盖父类中的方法run( )。
     创建该子类的一个线程对象。
     通过start( )方法启动线程
    

    2.通过实现Runnable接口,创建线程

定义一个实现Runnable接口的类。 定义方法run( )。Runnable接口中有一个空的方法run( ),实现它的类必须 覆盖此方法。
创建该类的一个线程对象,并将该对象作参数,传递给Thread类的构造函数,从而生成Thread类的一个对象。 // 注意这一步!
通过start( )方法启动线程

  • 线程的生命周期

无论采用继承Thread类还是实现Runnable接口来实现应用程序的多线程能力,都需要在该类中定义用于完成实际功能的run方法,这个run方法称为线程体(ThreadBody)

  • 按照线程体在计算机系统内存中的状态不同,可以将线程分为创建、就绪、运行、睡眠、挂起和死亡等类型:
  1. 创建状态(newborn):当利用new关键字创建线程对象实例后,它仅仅作为一个对象实例存在,JVM没有为其分配CPU时间片等线程运行资源。
  2. 就绪状态或可运行状态(Runnable):在处于创建状态的线程中调用start方法将线程的状态转换为就绪状态。这时,线程已经得到除CPU时间之外的其它系统资源,只等JVM的线程调度器按照线程的优先级对该线程进行调度,从而使该线程拥有能够获得CPU时间片的机会。
  3. 运行状态(running):运行状态表示线程正在运行,该线程已经有了对CPU的控制权。
  4. 睡眠状态(sleeping):在线程运行过程中可以调用sleep方法并在方法参数中指定线程的睡眠时间将线程状态转换为睡眠状态。这时,该线程在不释放占用资源的情况下停止运行指定的睡眠时间。时间到达后,线程重新由JVM线程调度器进行调度和管理。
  5. 挂起状态(blocked):可以通过调用suspend方法将线程的状态转换为挂起状态。这时,线程将释放占用的所有资源,由JVM调度转入临时存储空间,直至应用程序调用resume方法恢复线程运行。
  6. 停止状态(Dead):当线程体运行结束或者调用线程对象的stop方法后线程将终止运行,由JVM收回线程占用的资源。
  • 线程优先级
    当一个线程被启动,其默认的线程优先级是5,可以通过setPriority来设置现成的优先级
  • 多线程同步的方法:

1.Java通过关键字synchronized实现同步。
2.当对一个对象(含方法)使用synchronized,这个对象便被锁定或者说进入了 监视器。在一个时刻只能有一个线程可以访问被锁定的对象。它访问结束 时,让高优先级并处于就绪状态的线程,继续访问被锁定的对象,从而实现资源同步。

3.加锁的方法有两种:
a)锁定冲突的对象,
b)锁定冲突的方法。

注意:

  1. 对方法run( )无法加锁,不可避免冲突;
  2. 对构造函数不能加锁,否则出现语法错误。
  • 锁定对象同步实例:
public class WithSynchronizedTest {
    
    
	public static void main(String args[]) {
    
    
		UserThread2 Obj = new UserThread2();
		Thread t1 = new Thread(new UserMultThread2(Obj, 1));
		Thread t2 = new Thread(new UserMultThread2(Obj, 2));
		Thread t3 = new Thread(new UserMultThread2(Obj, 3));

		t1.start();
		t2.start();
		t3.start();
	}
}

class UserMultThread2 implements Runnable {
    
    
	UserThread2 UserObj;
	int num;

	UserMultThread2(UserThread2 o, int n) {
    
    
		UserObj = o;
		num = n;
	}

	public  void run() {
    
    
		synchronized(UserObj) {
    
    
		UserObj.Play(num);}
	}
}

class UserThread2 {
    
     // 资源冲突
	void Play(int n) {
    
    
		System.out.println("运行线程 NO:" + n);

		try {
    
    
			Thread.sleep(3);
		} catch (InterruptedException e) {
    
    
			System.out.println("线程异常, NO:" + n);
		}

		System.out.println("结束线程 NO:" + n);
	}
}

执行结果:
在这里插入图片描述

( ps:虽然不能锁定run方法,但是可以在run方法中定义其他的方法,然后锁定run方法中的方法从而实现间接锁定run方法)

おすすめ

転載: blog.csdn.net/weixin_45774350/article/details/105237767