目录
Java多线程(一)
线程和进程
概念
进程:进程是指在系统中独立运行的一段程序,是资源(内存、CPU)分配的最小单位,打开电脑上的任务管理器,比如QQ,IDEA等,一个应用就可以称之为一个进程。
线程:线程是指进程中的某一个任务,线程是程序执行的最小单位,比如QQ的发送消息或者接收消息就是指一个线程。一般来说,进程是由多个线程组成的,线程也可以看作是一个最小的进程。
区别
- 进程是资源分配的最小单位,线程是程序执行的最小单位;
- 进程有自己独立的地址空间,每启动一个进程,系统就会给进程分配独立的资源,而线程是共享该进程中的资源的;
- 进程间的通信比较复杂,而线程之间因为资源共享,所以线程间通信更方便;
- 多进程的程序比多线程的程序更加健壮,比如一个线程死掉,就可能会影响该进程下的其他线程,但是进程的资源是单独分配的,所以一个进程死掉不会影响其他进程;
- 在JVM中,栈和方法区属于进程的空间,而堆和程序计数器属于线程的空间;
- 在应用场景方面:如果程序需要频繁的创建和销毁的话,更适合使用多线程实现,因为多进程的话要话要不停的分配资源,就会对系统来说,开销比较大;而如果更追求程序的安全性的话,更适合用多进程来实现。
线程的3种创建方式
1. 继承Thread类
class Threadone extends Thread {
@Override
public void run() {
System.out.println("thread1 extend Thread...");
}
}
2. 实现implement接口
class Thread2 implements Runnable {
@Override
public void run() {
System.out.println("thread2 implements Runnable...");
}
}
3. 通过匿名内部类
Thread t = new Thread(){
@Override
public void run(){
System.out.println("通过匿名内部类实现的thread...");
}
}
线程的启动
- 通过start()方法启动线程
- run()方法只是thread下的一个普通方法,在主线程里执行
模拟实现银行叫号系统
- 要求:假设有银行有4个窗口,用多线程实现4个窗口按照1到10的顺序叫1~10号的号码,4个窗口叫的10个号没有遗漏。
- 实现代码:
class bankSystemOne extends Thread {
private String name;
private static final int max = 10;//最大号码到10
private static int number = 1;// 当前叫到的号码
public bankSystemOne(String name){
this.name = name;
}
@Override
public void run() {
while(number <= max) {
System.out.println(name + "窗口: " + number++);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Test {
public static void main(String[] args){
bankSystemOne window1 = new bankSystemOne("一号");
window1.start();
bankSystemOne window2 = new bankSystemOne("二号");
window2.start();
bankSystemOne window3 = new bankSystemOne("三号");
window3.start();
bankSystemOne window4 = new bankSystemOne("四号");
window4.start();
}
}
运行结果:
与上面同理:通过实现接口的方法实现如下
class bankSystemTwo implements Runnable {
private static final int max = 10;//最大的号码
private static int num = 1;//当前叫到的号码
@Override
public void run() {
for(int i = num;i <= max;i = num){
System.out.println(Thread.currentThread().getName() + num++);
try {
Thread.sleep(15);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Test {
public static void main(String[] args){
bankSystemTwo bank = new bankSystemTwo();
Thread windowOne = new Thread(bank,"一号窗口: ");
windowOne.start();
Thread windowTwo = new Thread(bank,"二号窗口: ");
windowTwo.start();
Thread windowThree = new Thread(bank,"三号窗口: ");
windowThree.start();
Thread windowFour = new Thread(bank,"四号窗口: ");
windowFour.start();
}
}
运行结果:
注:如上仅个人理解所写,如有错误请批评指正,谢谢~