实现多线程两种方式
一 继承Thread类
二 实现Runnable接口
因为Thread类已经实现了Runnable接口,
所以两者本质都是实现Runnable接口,并且实现Runnable接口中的run方法.
下面写了一个小例子,直接上代码。
public class TestThread {
public static void main(String[] args) {
/* Thread thread = new Thread(); //创建一个线程对象
thread.start(); //对线程对象调用start方法 创建线程(让线程启动)
//os操作系统中创建线程
// thread.stop(); //线程停下来*/
ThreadA threadA = new ThreadA();
// threadA.start(); //调用start方法创建线程
// threadA.run(); //错误
// ThreadB threadB = new ThreadB();
Runnable target=new ThreadB();
Thread threadB = new Thread(target);
threadA.start(); //调用start方法创建线程
threadB.start();
}
}
class ThreadA extends Thread{
@Override
public void run() {
for (int i = 0; i <=10000 ; i++) {
System.out.println("$$$"+i);
}
}
}
class ThreadB implements Runnable{
@Override
public void run() {
for (int i = 0; i <=10000 ; i++) {
System.out.println("###"+i);
}
}
}
运行结果,粘贴了其中的一部分。
为什么会是这种结果,而不是将threadA线程执行完,在执行threadB线程呢?因为线程是操作系统分cpu时间片调度运行,所以threadA线程与threadB线程会交替执行。
下面是我学习时的一些总结。
进程:操作系统 os (Operating System)并发的一个任务
计算机核心(一个cpu),中央处理器
计算机: cpu分时间片交替执行 宏观并行,微观串行 时间片由谁调度 ==》 操作系统调度
java程序运行在虚拟机中,虚拟机相当于一个软件,虚拟机本身是一个进程。(单进程)
线程==》一个进程中,并发执行的顺序流程
操作系统并发多进程 进程并发多线程
线程的组成:1、cpu时间片 由os负责调度分配 2、data 数据 3、code 代码
jdk 负责编译java代码 jre java代码的运行环境 java虚拟机 java代码在java虚拟机中运行 jdk包含jre jre包含java虚拟机
数据:
创建对象:在java虚拟机的内存分配空间 虚拟机内存: 1、堆空间 2、栈空间 3、代码空间(由程序员指定)
学习多线程:堆 栈 搞明白
堆空间负责存储对象 其实就是存属性(实例变量) 类中方法外
栈空间负责存储局部变量 方法内
堆空间共享,栈空间独立 创建对象共享,局部变量独立。 线程是轻量级的进程。==》数据交换 只需要切换栈空间
进程间,堆栈都是独立的。 数据交换 堆栈空间都需要切换
任何一个java程序都需要一个主线程, Thread线程对象代表一个线程
线程是操作系统维护的,线程对象在虚拟机中的堆空间中。
另外还可以设置一下线程的优先级,代码如下
public class TestThread {
public static void main(String[] args) {
Runnable task1 = new Task1();
Thread t1 = new Thread(task1);
t1.setPriority(10); //设置线程的优先级 1-10的整数 10为最高优先级 优先让t1线程先执行完毕,不同的操作系统os有不同的线程调度策略,不是每个操作系统都支持优先级的
//t1.setPriority(Thread.MAX_PRIORITY);
Thread t2 = new TaskThread();
//主线程让t1 t2线程启动,t1 t2启动后,主线程结束使命,进入终止状态。
t1.start(); //这两个方法在主线程中
t2.start(); //这两个方法在主线程中
}
}
class Task1 implements Runnable{
public void run(){
for(int i = 1 ; i <= 1000 ; i++){
System.out.println("### "+i);
}
}
}
class TaskThread extends Thread{
public void run(){
for(int i = 1 ; i <= 1000 ; i++){
System.out.println("$$$ "+i);
}
}
}