欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

初识线程

程序员文章站 2022-05-12 10:55:44
...

初识线程

 

每当我们提起线程,可能会将其与进程或者程序的概念混淆,无法区分这三者之间的关系。现在,让我来梳理梳理这三个概念的区别。程序是代码、文件等得集合,是静态的,可以复制到不同的计算机上;进程是执行中的程序,是动态的,无法复制到其他计算机中;线程是进程中的执行单位,同个进程下的线程共用进程中的内存资源。以学校上课为例:程序相当于同一年级的教学安排表,适用于不同的班级;进程相当学校上课,切切实行教学安排表;线程就类似于每一个上课的班,班里的每一个同学,相当于没有具有具体行为的对象。

Java中实现线程有两种方式:通过继承java.lang.Thread类;通过实现java.lang.Runnable接口。

通过继承Thread类实现线程主要是重写run()方法——将执行代码添加到run()方法中。

 

/**
 *  学校类
 * @author Daily
 *
 */
public class School {

	/**
	 *  主进程入口
	 * @param args
	 */
	public static void main(String[] args) {
		Teaching teach1=new Teaching();	// 创建第一个教学线程对象
		Teaching teach2=new Teaching(); // 创建第二个教学线程对象
		teach1.start();					// 调用第一个线程对象的启动方法
		teach2.start();					// 调用第二个线程对象的启动方法
	}

}

/**
 *  自定义一个上课线程类
 * @author Daily
 *
 */
public class Teaching extends java.lang.Thread{
	private int[] a={1,2,3,4,5,6,7};					// 上课班级课程序号
	private java.util.Random ran=new java.util.Random();// 随机数对象,每个班上课时间、上课课程可能不一样
	
	/**
	 *  重写run()方法,将实现代码加入此方法中
	 */
	public void run(){
		for (int i=0;i<7;i++){
			System.out.println(currentThread().getName()+"在上"+a[ran.nextInt(7)]+"号课程");
		}
	}
}

 

通过实现Runnable接口,并通过Thread类创建线程对象。

 

/**
 *  学校类
 * @author Daily
 *
 */
public class School {

	/**
	 *  主进程入口
	 * @param args
	 */
	public static void main(String[] args) {
		Teaching1 teach1=new Teaching1();	// 创建第一个教学线程对象
		Teaching1 teach2=new Teaching1();	// 创建第二个教学线程对象
		/*--------------------这两个对象共同完成一个教学安排--------------*/
		Thread thread1=new Thread(teach1);	// 根据teach1创建第一个线程对象
		Thread thread2=new Thread(teach1);	// 根据teach1创建第二个线程对象
		/*-------------------------------------------------------*/
		
		/*--------------------这个对象自己完成一个教学安排---------------*/
		Thread thread3=new Thread(teach2);	// 根据teach2创建第三个线程对象
		/*------------------------------------------------------*/
		thread1.start();					// 调用第一个线程对象的启动方法
		thread2.start();					// 调用第二个线程对象的启动方法
		thread3.start();					// 调用第三个线程对象的启动方法
	}

}

/**
 *  实现Runnable接口的上课类
 * @author Daily
 *
 */
public class Teaching1 implements java.lang.Runnable{
	private int[] a={1,2,3,4,5,6,7};					// 上课班级课程序号
	private java.util.Random ran=new java.util.Random();// 随机数对象,每个班上课时间、上课课程可能不一样
	
	/**
	 *  重写run()方法,同样将执行代码加入此方法中
	 */
	public void run() {
		for (int i=0;i<7;i++){
			System.out.println(Thread.currentThread().getName()+"在上"+a[ran.nextInt(7)]+"号课程");
		}
	}
	
}

切忌主函数直接调用线程的run()方法。线程类主要是通过start()方法实现了线程方法,如果直接调用我们重写的方法,那么就是Thread类失去了其存在的意义,此时我们任然实现的是单线程——>主线程,而非多线程。