java多线程一:线程的状态及启动

一、初始

1、应用是正在使用的程序
在这里插入图片描述

2、电脑中有很多我们没有自己手动打开的在用的程序,但是在电脑上是运行着的程序,即在后台运行的程序。
3、PID是电脑为每一应用程序分配的一个标识符号,都是唯一的。但是不是固定的。
在这里插入图片描述
4、进程和线程的关系:

  • 一个进程中可以有多个线程
  • 有线程必须有进程,没有进程就没有线程。
  • 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础
  • 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
    5、main方法:是一个程序运行的主入口,main方法是一个线程。 一个程序的运行会默认启动两个线程:jvm虚拟机和gc垃圾回收。

二、java多线程基本使用

1、如何创建线程

  • 继承Thread类
  • 实现runnable
  • 实现callable(使用线程池区进行操作)

2、启动线程

  • thread和runnable使用start方法,默认执行run方法,没有返回值
  • callable是使用线程池调用,默认执行call方法,可以有返回值。

三、线程的具体使用

3.1Thread类

1、

public class ThreadTwo  extends Thread{

	@Override
	public void run() {
		try {
			//程序睡眠10秒
			Thread.sleep(1000);
			for (int i = 0; i < 10; i++) {
				System.out.println("1231323123");
			}
			System.out.println("线程醒来了");
		} catch (InterruptedException e) {
			if(e!=null) {
				System.out.println("中断sleep操作"+e.getMessage());
			}
			
		}
		System.out.println(Thread.currentThread().getName()+"线程在执行");
	}
	
	
	
	public static void main(String[] args) {
		ThreadTwo  t01=new ThreadTwo();
		ThreadTwo  t02=new ThreadTwo();
		System.out.println("是不是后台线程"+t01.isDaemon());
		// 设置为后台线程 
		t01.setDaemon(true);
		System.out.println("是不是后台线程"+t01.isDaemon());
		// 启动线程
		t01.start();
		t02.start();
		System.out.println(t01.isAlive());//线程启动之后活动状态
		
	}
}

2、 - run方法和start方法的区别

  • 线程调用run方法,不会启动线程,等同于普通的对象调用方法。
  • 线程调用start,可以启动线程(jvm),线程就会进行CPU资源抢占,哪个先抢到就先执行,当一个线程抢到之后,没有执行完,其他线程是无法进行操作的。也有可能两个同时抢到。
  • 多线程再执行的时候使用的是抢占式调度模式。

3、2Thread的常用操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 优先级包括1、5、10,数字越小优先级越高,但是一般情况下不要使用,没有任何作用。
public static void main(String[] args) {
		
	
		  //创建线程对象  
		ThreadOne  th01=new ThreadOne("线程一1");
		th01.setPriority(1);
		ThreadOne  th02=new ThreadOne("线程一2");
		th02.setPriority(5);
		ThreadOne  th03=new ThreadOne("线程一3");
		th03.setPriority(5);
		
		// 启动线程 
		th01.start();
		th02.start();
		th03.start();
	}
  • 使用thread来获取src资源文件夹下的文件。
    (由java程序根据jvm获取到类加载器,获取需要的java文件(资源文件)
public static void main(String[] args) {
		try {
			//JVM的工作原理    
			Thread currentThread = Thread.currentThread();
			ClassLoader contextClassLoader = currentThread.getContextClassLoader();//上下文类加载器
			InputStream fis = contextClassLoader.getResourceAsStream("th.txt");//使用类加载器 ClassLoader 获取
			byte [] b=new byte[15];
			fis.read(b);
			
			System.out.println(new String(b));
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
		}
	
	}

3、3线程的状态

在这里插入图片描述

  • 新建状态----实例化线程
  • 就绪状态----调用start方法
  • 运行状态----调用run方法
  • 阻塞状态----sleep睡眠 、wait、yield
  • 死亡状态----线程对象的销毁

3、4Runnable接口

  • 1、实例化:实现runnable接口,只有一个run方法,可以使用lambda和匿名对象的方式实例化。
    在这里插入图片描述
  • 2、启动:需要将runnable交给Thread来启动
    在这里插入图片描述
  • 3、Thread和eunnable的比较
  • 比如火车售票的操作,大家买火车票都去窗口买,两个窗口进行售票,使用Thread操作,属性没有静态化,卖出去的票数是双份的,使用runnable,可以使用多个thread共享一个runnable的资源,等同于静态属性。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值