多线程入门基础知识

多线程入门基础知识

  • 进程与线程
    • 什么是进程?
    • 什么是线程?
  • 多线程
    • 为什么要使用多线程?
    • 如何创建线程
    • 创建线程是继承Thread类好,还是实现Runnable接口好?
    • Thread.sleep()方法
    • Thread.getId()
    • Thread.getName()
    • 线程的5大状态

进程与线程

什么是进程?

  • 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
  • 在windows系统上启动一个应用qq,这个就属于一个进程

什么是线程?

  • 是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。线程有就绪、阻塞和运行三种基本状态。
  • qq打开一个对话窗口,一个窗口就是一个线程

进程是所有线程的集合,每一个线程是进程中的一条执行路径。
每开一个线程,都会占用CPU资源

示例代码

package com.thread;

/**
 * 什么是进行:进程就是一个应用程序
 * 什么是线程:线程就是一条执行路径
 * @author lenovo
 *
 */
public class ThreadDemo01 {
	
	/**
	 * main函数是主线程,主线程是线程路口,自己创建的线程是 子线程
	 * 在java SE中main函数是主线程入口,但是在javaEE中springmvc项目中controller层就是主线程入口
	 * gc是线程专门回收垃圾
	 * @param args
	 */
	public static void main(String[] args) {
		System.err.println("this is threaddemo01");
	}

}

多线程

为什么要使用多线程?

  • 多线程的好处提高程序效率,一个应用程序中存在多个执行路径并行执行。

如何创建线程

  1. 继承Thread类,重写run()方法
package com.thread;



class CreateThread extends Thread{

	/**
	 * 执行需要线程执行的任务
	 */
	@Override
	public void run() {
		System.err.println("线程开始启动run");
		for(int i=0;i<20;i++) {
			System.err.println("run() i:"+i);
		}
		System.err.println("线程结束run");
	}
	
}

/**
 * 创建多线程
 * @author lenovo
 *
 */
public class ThreadDemo02 {

	public static void main(String[] args) throws Exception {
		System.err.println("创建线程开始main");
		//1.自定义一个线程类,继承Thread类,重写run()方法
		//2.启动一个线程,调用start()方法
		//3.不能直接调用run()方法,相当于直接主线程调用run方法,只能调用start()方法,创建一个子线程
		//4.多线程中,异步执行,每个线程都是单独的执行路径,互不影响
		//5.多线程中,代码不会从上往下执行,会同时进行并行
		CreateThread createThread = new CreateThread();
		createThread.start();
		System.err.println("线程开始启动main");
		for(int i=0;i<20;i++) {
			if(i==10) {
				throw new Exception();
			}
			System.err.println("main() i:"+i);
		}
		System.err.println("线程结束main");
	}
	
}
  1. 实现Runnable接口
package com.thread;

class CreateRunnable implements Runnable {

	/**
	 * run方法执行线程需要执行的代码
	 */
	@Override
	public void run() {
		System.err.println("run线程启动启动");
		for(int i=0;i<20;i++) {
			System.err.println("run() i:"+i);
		}
	}
	
}


public class ThreadDemo03 {
	
	public static void main(String[] args) {
		System.err.println("main创建线程开始");
		CreateRunnable createRunnable = new CreateRunnable();
		System.err.println("main线程启动");
		Thread thread = new Thread(createRunnable);
		thread.start();
		for(int i=0;i<20;i++) {
			System.err.println("main() i:"+i);
		}
	}

}
  1. 使用匿名内部类方式创建线程
package com.thread;

/**
 * 使用匿名内部类创建线程
 * @author lenovo
 *
 */
public class ThreadDemo04 {

	public static void main(String[] args) {
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i=0;i<20;i++) {
					System.err.println("run() i:"+i);
				}
			}
		}).start();;
		
		for(int i=0;i<20;i++) {
			System.err.println("main() i:"+i);
		}
	}
	
}

创建线程是继承Thread类好,还是实现Runnable接口好?

  • 实现runnable接口好,应为实现runnable接口后,还可以继承其他的类和时间其他接口
    如果是继承Thread类的话,不能继承其他类

Thread.sleep()方法

  • sleep方法让当前线程从运行状态变为休眠状态,当时间到期,线程进入就绪状
  • sleep不能释放锁

Thread.getId()

  • id是当前线程随机创建全局唯一

Thread.getName()

  • 获取当前线程名称

注:继承Thread类的线程类,可以直接使用getId()和getName()方法
实现Runnable接口的线程类,需要使用Thread.currentThread()方法来获取当前新线程,来调用getId()和getName()方法

线程的5大状态

  1. 新建状态
    当创建线程是new Thread(),或new Thread®时,线程处于新建状态
  2. 就绪状态
    当调用Thread.start()方法后,线程处于就绪状态,start()方法创建线程运行的系统资源,线程还必须同其他线程竞争CPU时间,只有获得CPU时间才可以运行线程
  3. 运行状态
    当线程抢到CPU时,会调用run()方法,此时线程处于运行状态
  4. 阻塞状态
    原因一:当调用Thread.sleep()方法后线程从运行状态进入阻塞状态,当时间到期,线程会回到就绪状态,等待线程调度程序(thread scheduler)来调度的
  5. 死亡状态
    当run()方法执行完毕或者调用stop()方法后,线程结束,进入死亡状态

你可能感兴趣的:(多线程,java,多线程,Thread,基础)