前言
最近开始对java进行学习,之前毛毛躁躁的也看过一些简单的基础知识,因为对编程感兴趣,在依葫芦画瓢选择性学习socket编程时,对学习过程中涉及的很多知识点还是不清楚,尤其是对多线程编程这块认知甚少,因此根据查缺补漏的原则开始学习多线程。
一、多线程的概念
多线程实际就是并发处理。操作系统在运行程序时,会分配相应的资源给到该程序运行,可以说进程是操作系统分配的基本单元。注意,这里是操作系统对资源的分配,那么操作系统实际又由CPU来运行,CPU运行程序实际是对进程里面的线程进行操作。这里就要说下,操作系统创建进程后,进程里面又创建线程供CPU实际执行,因此也说线程是CPU执行的基本单元。
二、JAVA程序线程的实现
JAVA创建线程有3种方式,1、通过继承Thread类,并重写run方法。2、通过实现Runnable接口的run方法;3、callable方法(看过多线教程博文的都应该清楚,大家都说这种方式创建应用的场合很少,都没有过多的介绍,我也没去看了)。三种方式各有特点,继承Thread类,那么就不能继承其他类了,但是在线程中可以直接使用This来获取当前线程资源;实现Runnable方法的话,则可以继承其他类;第三种方式据说是可以有返回值。前两种是没有的。
1.继承Thread方法创建线程
前面的介绍说到,不管是继承Thread类还是实现Runnable方法创建线程,实际都是要对run方法进行处理,也就是我们线程最终是执行run方法中的内容。那么废话不多说,开始创建我们的线程Demo。
代码如下(示例):
package com.st.threadst;
public class CreateByThread extends Thread {
//继承thread方法创建线程
@Override
public void run() {
super.run();
System.out.println("使用继承Thread方法创建线程,现在运行线程:" + this.getName());
}
}
main方法运行:
package com.st.threadst;
public class ThreadMainDemo {
public static void main(String[] args) {
//创建线程
CreatByThread cbt = new CreatByThread();
//运行线程
cbt.start();
}
}
运行结果:
使用继承Thread方法创建线程,现在运行线程:Thread-0
运行结果中,Thread-0为线程的名字,如果没有给线程命名,那么进程会自动为线程命名,也就是getname方法所获取到的为默认命名。
2.实现Runnable方法创建线程
代码如下(示例):
package com.st.threadst;
public class CreateByRunnable implements Runnable {
@Override
public void run() {
System.out.println("使用继承Thread方法创建线程,现在运行线程:" + Thread.currentThread().getName());
}
}
main方法运行。
package com.st.threadst;
public class RunnableMainDemo {
public static void main(String[] args) {
CreateByRunnable cbr = new CreateByRunnable();
Thread t1 = new Thread(cbr, "Runnable方式创建线程");
t1.start();
}
}
运行结果
使用继承Thread方法创建线程,现在运行线程:Runnable方式创建线程
这里获取线程名的方式与之前的就稍有不同。线程名任何时候都可以使用
Thread.currentThread().getName()获取。
总结
这里先对线程有个基本的概念。了解如何创建线程。