多线程
概念
程序和进程
- 程序 - 数据结构 + 算法,主要指存放在硬盘上的可执行文件。
- 进程 - 主要指运行在内存中的可执行文件。
- 目前主流的操作系统都支持多进程,为了让操作系统同时可以执行多个任务,但进程是重量级的, 也就是新建一个进程会消耗CPU和内存空间等系统资源,因此进程的数量比较局限。
线程
- 为了解决上述问题就提出线程的概念,线程就是进程内部的程序流,也就是说操作系统内部支持多 进程的,而每个进程的内部又是支持多线程的,线程是轻量的,新建线程会共享所在进程的系统资源,因此目前主流的开发都是采用多线程。
- 多线程是采用时间片轮转法来保证多个线程的并发执行,所谓并发就是指宏观并行微观串行的机制。
线程的创建
- 多线程是采用时间片轮转法来保证多个线程的并发执行,所谓并发就是指宏观并行微观串行的机制。
使用Thread类
方式1

//创建Thread
public class ThreadTest {
public static void main(String[] args) {
//使用无参方式构造Thread类性对象
//由源码可知,Thread 类中的成员变量target的数值为null
Thread t1 = new Thread();
//调用run方法进行测试
//由源码可知,成员变量target的数值为null,条件(target!=null)不成立,{}中的代码跳过不执行,且没有其他代码,所以run方法没有进行任何操作
t1.run();
}
}
//创建子类
public class SubThreadRun extends Thread{
@Override
public void run(){
for (int i =1; i<=20;i++){
System.out.println(i);
}
}
---------------------------------------------------------------------------
public class SubThreadRunTest {
public static void main(String[] args) {
//声明Thread类型的引用指向子类类型的对象
Thread t1 =new SubThreadRun();
//调用run方法测试,本质上相当于普通成员方法的调用,因此执行流程就是run方法的代码执行完毕后才能继续向下执行
//t1.run();
//用于启动线程,Java虚拟机会自动调用该线程类中的run方法,相当于又启动了一个线程,加上执行main方法的线程是两个线程
t1.start();
}
}
方式2

public class SubRunnableRun implements Runnable{
@Override
public void run() {
for (int i =1; i<=20;i++){
System.out.println(i);
}
}
}
------------------------------------------------------
public class SubRunnableRunTest {
public static void main(String[] args) {
//创建自定义类型的对象,也就是实现Runnable接口类的对象
SubRunnableRun srr =new SubRunnableRun();
//使用该对象作为实参构造Thread类型的对象
//由源码可知,经过构造方法的调用之后,Thread类中的成员变量target的数值为srr
Thread t1 = new Thread(srr);
//使用Thread类型的对象调用Start方法
//使用Runnable引用构造了线程对象,调用该方法(run)时最终调用接口中的版本
t1.start();
}
}

匿名内部类的方式实现线程创建和启动
public class ThreadNonameTest {
public static void main(String[] args) {
//使用继承加匿名内部类的的方式创建并启动线程
/*Thread t1 =new Thread(){
@Override
public void run(){
System.out.println("aaa");
}
};
t1.start();*/
new Thread(){
@Override
public void run(){
System.out.println("aaa");
}
}.start();
//使用接口加匿名内部类的方式创建并启动线程
/* Runnable ra = new Runnable(){
@Override
public void run(){
System.out.println("bbb");
}
};
Thread t2 = new Thread(ra);
t2.start();*/
/* new Thread(new Runnable(){
@Override
public void run(){
System.out.println("bbb");
}
}).start();*/
//Java8开始支持lambda表达式:(形参列表)->{方法体;}
/* Runnable ra = ()->System.out.println("bbb");
new Thread(ra).start();*/
new Thread(()-> System.out.println("bbb"));
}
}
线程的生命周期

线程的名称和编号


常用方法
Sleep方法


Priority方法

Daemon方法

案例

public class SubThread extends Thread {
@Override
public void run(){
for(int i =1; i<100;i +=2){
System.out.println("子线程1中"+i);
}
}
}
-------------------------------------------------
public class SubThread2 extends Thread {
@Override
public void run(){
for(int i =2; i<=100;i +=2){
System.out.println("子线程2中"+i);
}
}
}
////////////////////////////////////////////////
public class SubThreadTest {
public static void main(String[] args) {
SubThread st1 = new SubThread();
SubThread2 st2 = new SubThread2();
st1.start();
st2.start();
System.out.println("主线程开始等待");
try {
st1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
st2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程等待结束");
}
}

297



被折叠的 条评论
为什么被折叠?



