一、线程
线程组成了程序执行中的进程,一个进程可以包含多个子线程,主线程只有一个(Main主方法执行后,JVM会为其开辟一个主线程),进程就是程序的执行
对讲机:说话的时候不能收到声音,收声音的时候不能讲话(单线程)
学会创建子线程,子线程是在主线程中开启的...
1、子线程的创建方式
第一种:继承Thread类,重写run方法
run方法的方法体内就是子线程要执行的程序代码
/** * 线程创建的方式一 * 继承Thread类,重写run方法 */ public class Demo01 { public static void main(String[] args) { System.out.println("-->主线程开启.."); //创建子线程对象 ThreadA t1 = new ThreadA(); ThreadA t2 = new ThreadA(); //t1.run();//相当于调用普通方法,开启线程用start() t1.setName("子线程01");//设置线程名字 t1.setPriority(10);//设置线程优先级 t2.setName("子线程02"); t2.setPriority(5); t1.start();//开启子线程 t2.start();//开启子线程 } } /** * 自定义的子线程类 */ class ThreadA extends Thread{ @Override public void run() { for (int i = 1; i <= 100; i++) { System.out.println(this.getName()+":"+i); } } }
第二种:实现Runnable类,重写run方法
比较麻烦,Thread线程就是Runnable接口的实现类(子类)
Runnable缺乏线程启动的方法,需要封装Thread才能运行
/** * **第二种:实现Runnable类,重写run方法** */ public class Demo02 { public static void main(String[] args) { System.out.println("-->主线程开启.."); //创建Runnable接口的实现类 子线程类ThreadB ThreadB tb1 = new ThreadB(); tb1.setName("Runnable01"); ThreadB tb2 = new ThreadB(); tb2.setName("Runnable02"); //启动 Thread t1 = new Thread(tb1);//封装到Thread中,为了能启动 Thread t2 = new Thread(tb2);//封装到Thread中,为了能启动 t1.start(); t2.start(); } } /** * 子线程类ThreadB */ class ThreadB implements Runnable{ private String name; @Override public void run() { for (int i = 1; i <= 100; i++) { System.out.println(this.name+":"+i); } } public String getName() { return name; } public void setName(String name) { this.name = name; } }
第三种:匿名子线程
//子线程对象 Thread t1 = new Thread(){ @Override public void run() { for (int i = 1; i <= 100; i++) { System.out.println("匿名子线程:"+i); } } }; t1.start();
线程如何停止
线程对象调用stop()
柜台商品管理(实现了数据的持久化)
虽然我们手动退出会备份保存,每过10秒自动备份