初识线程
程序员文章站
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类失去了其存在的意义,此时我们任然实现的是单线程——>主线程,而非多线程。
上一篇: 【练习】字符反转