简洁的网站建设合同,哪个推客平台最好,扬州网站制作哪家好,初中生怎样做网站赚钱一、多任务
现实中太多这样同时做多件事的例子了#xff0c;例如一边吃饭一遍刷视频#xff0c;看起来是多个任务都在做#xff0c;其实本质上我们的大脑在同一时间依旧只做了一件事情。 二、普通方法调用和多线程 普通方法调用只有主线程一条执行路径
多线程多条执行路径…一、多任务
现实中太多这样同时做多件事的例子了例如一边吃饭一遍刷视频看起来是多个任务都在做其实本质上我们的大脑在同一时间依旧只做了一件事情。 二、普通方法调用和多线程 普通方法调用只有主线程一条执行路径
多线程多条执行路径主线程和子线程并行交替执行 三、Process与Thread 说起进程就不得不说下程序。程序是指令和数据的有序集合其本身没有任何运行的含义是一个静态的概念。 而进程则是执行程序的一次执行过程它是一个动态的概念。是系统资源分配的单位 通常在一个进程中可以包含若干个线程当然一个进程中至少有一个线程不然没有存在的意义。线程是CPU调度和执行的单位 注意很多多线程是模拟出来的真正的多线程是指有多个cpu即多核如服务器。如果是模拟出来的多线程即使在一个cpu的情况下在同一个时间点cpu只能执行一个代码因为切换的很快所有就有同时执行的错觉。 四、核心概念 线程就是独立的执行路径 在程序运行时即使没有自己创建线程后台也会有多个线程如主线程gc线程 main()称之为主线程为系统的入口用于执行整个程序 在一个进程中如果开辟了多个线程线程的运行由调度器安排调度调度器是与操作系统紧密相关的先后顺序是不能人为的干预的 对同一份资源操作时会存在资源抢夺的问题需要加入并发控制 线程会带来额外的开销如cpu调度时间并发控制开销 每个线程在自己的工作内存互交内存控制不当会造成数据不一致 五、线程的创建
三种创建方式 继承Thread类 实现Runnable接口 实现Callable接口
一、Thread类 自定义线程类继承Thread类 重写run()方法编写线程执行体 创建线程对象调用start()方法启动线程 注意线程不一定立即执行CPU安排调度
//创建线程方式一继承Thread类重写run()方法调用start方法开启线程
//总结注意线程开启不一定立即执行由CPU调度执行
public class TestThread extends Thread{Overridepublic void run() {//run方法线程体for (int i 0; i 20; i) {System.out.println(我在看代码----i);}}
public static void main(String[] args) {//main线程主线程
//创建一个线程对象TestThread testThread new TestThread();//调用start()方法开启线程testThread.start();
for (int i 0; i 1000; i) {System.out.println(我在学习多线程---i);}}
} 此处说明调用run()方法只是按照顺序简单执行run()方法而调用start()方法才会把线程交给调度器去调度执行 二、Runnalbe接口 定义MyRunnable类实现Runnable接口 实现run()方法编写线程执行体 创建线程对象调用start()方法启动线程
package day01;
/*** Author: Grace* Date: 2023/10/1 12:29* Description:*/
//创建线程方式2实现runnable接口重写run方法执行线程需要丢入runnable接口实现类调用start方法
public class TestThread02 implements Runnable{
Overridepublic void run() {//run方法线程体for (int i 0; i 20; i) {System.out.println(我在看代码----i);}}
public static void main(String[] args) {//创建runnable接口的实现类对象TestThread02 testThread02 new TestThread02();//创建线程对象通过线程对象来开启我们的线程代理/* Thread thread new Thread(testThread02);
thread.start();*/
new Thread(testThread02).start();
for (int i 0; i 1000; i) {System.out.println(我在学习多线程---i);}}
}
小结 继承Thread类 子类继承Thread类具备多线程能力 启动线程子类对象.start() 不建议使用避免OOP单线程局限性 实现Runnable接口 实现接口Runnable具有多线程能力 启动线程传入目标对象Thread对象.start() 推荐使用避免单继承局限性灵活方便方便同一个对象被多个线程使用
三、实现Callable接口 实现Callable接口需要返回值类型 重写call方法需要抛出异常 创建目标对象 创建执行服务ExecutorService ser Executors.newFixedThreadPool(1); 提交执行FutureBoolean result1 ser.submit(t1) 获取结果boolean r1 result1.get() 关闭服务ser.shutdownNow()
Callable的好处1.可以抛出异常 2.有返回值 六、初识并发问题
//多个线程同时操作同一个对象
//买火车票的例子
//发现问题多个线程操作同一个资源的情况下线程不安全数据紊乱
public class TestThread03 implements Runnable{
//票数private int ticketNums 10;Overridepublic void run() {while (true){if(ticketNums0){break;}//模拟延时try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}
System.out.println(Thread.currentThread().getName()--拿到了第ticketNums--票);}}
public static void main(String[] args) {TestThread03 testThread03 new TestThread03();
new Thread(testThread03,小明).start();new Thread(testThread03,老师).start();new Thread(testThread03,黄牛党).start();}
}