package cn.lian.test; /** * 线程 和 进程 * 进程 :一个应用程序 * 线程 :一个进程中的执行场景 或 执行单元 * 注 :一个进程可以启动多个线程 * 对现在的java来说 最少有两个线程并发 一个是 执行main方法的主线程 另一个是垃圾回收线程 * *二者有啥关系 * 进程相当于是公司,线程是公司的员工 * 注意:进程和进程之间是独立的 内存独立不共享 * * 线程和线程之间关系? * 线程A 和 线程B 堆内存和方法区内存共享 栈内存独立 一个线程一个栈 * * */ public class Demo { public static void main(String[] args) { System.out.println("主线程 开启"); //创建 子线程对象 Thread t1 = new zixianch(); t1.setName("子线程"); t1.start(); for (int i = 0; i < 10; i++) { System.out.println("主线程" + i); } } static class zixianch extends Thread{ @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(this.getId() + ":" + this.getName() + ":" + i); } } } }
package cn.lian.test2; /** * 法方式二:实现java.lang.Runnable 接口 实现Run方法 * 比较方便 这个类实现接口后还可以继承其他类 更灵活 * */ public class Demo { public static void main(String[] args) { System.out.println("主线程 开启"); xiancher xiancher = new xiancher(); xiancher.setName("子线程"); //创建子线程对象 并封装到Threda中 Thread t1 = new Thread(xiancher); t1.start(); for (int i = 0; i < 10; i++) { System.out.println("主线程:" + i); } } } class xiancher implements Runnable{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println( this.name + ":"+i); } } }
package cn.hp.test3; public class Demo { public static void main(String[] args) { // Demo d1 = new Demo(); // new Demo();//匿名对象 Thread t1 = new Thread(){ @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("这是一个匿名子线程"+i); } } }; t1.start(); //t1.stop(); } }