当前位置:首页 > 开发 > 编程语言 > 多线程 > 正文

初识线程

发表于: 2014-08-04   作者:殇瓶-MIN   来源:转载   浏览:
摘要: 初识线程   每当我们提起线程,可能会将其与进程或者程序的概念混淆,无法区分这三者之间的关系。现在,让我来梳理梳理这三个概念的区别。程序是代码、文件等得集合,是静态的,可以复制到不同的计算机上;进程是执行中的程序,是动态的,无法复制到其他计算机中;线程是进程中的执行单位,同个进程下的线程共用进程中的内存资源。以学校上课为例:程序相当于同一年级的教学安排表,适用于不同的班级;进程相当学

初识线程

 

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

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类失去了其存在的意义,此时我们任然实现的是单线程——>主线程,而非多线程。

初识线程

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
认识线程池 --|参考JDK API的理解: 线程池可以解决两个不同问题:由于减少了每个任务调用的开销,
线程初识 没有线程编程的程序好比一个人一只手干活,而多线程的程序就好比一个人多只手干活. 进程是
在Android开发中有一项非常重要的技术---多线程,本文针对线程的创建,开启,休眠和中断做介绍。 如
仅是对自己在学习多线程知识时的点点滴滴进行记录。希望园子里的朋友多多指点。 1、为什么要使用线
标签: PhoneGap 一、PhoneGap是什么? PhoneGap是一个标准的开源框架,用PhoneGap开发移动应用是免
背景知识: Ajax(Asynchronous JavaScript and XMLS异步JavaScript和XML)(“阿贾克斯”)技术 完成页
Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoo
Lucene 简介 Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为
比 较喜欢一些新奇的东西,今天在网上闲逛,看到Basic4GL这个东东。一个比较好的应用是可以用他来写
比较喜欢一些新奇的东西,今天在网上闲逛,看到Basic4GL这个东东。一个比较好的应用是可以用他来写2
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号