day--16
GUI编程 都快淘汰了 所以暂时还是不看了
多线程(多任务)
-
程序: 程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
-
进程 在操作系统中运行的程序就时进程,比如你的QQ,播放器,IDE灯
1. 进程里面有很多,比如声音、图像、字幕这些就是线程 1. 进程是执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位 1. 进程中可以包含若干葛线程,一个进程中至少有一个线程,不然没有存在的意义。线程是CPU调度和执行的单位。
-
线程:很多线程是模拟出来的,真正的多线程是指有多个CPU,即多核,如服务器。如果是模拟出来的多线程,即在一个cpu的情况下,在同一个时间点,cpu只能执行一个代码,因为切换的快,所以就有同时执行的错觉。 "main" 就是主线程
核心概念
- 线程就是独立的执行路径;
- 在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc(清理垃圾的)线程;
- main()称之为主线程,为系统的入口,用于执行整个程序;
- 在一个进程中,如果开辟了多个线程,线程的运行由调度器(cpu)安排调度,调度器是与系统紧密相关的,先后顺序是不能人为干预的。
- 对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制;
- 线程会带来额外的开销,如cpu调度世间,并发控制开销。
- 每个线程在自己的工作内存交互,内存控制不当会造成数据不一致
线程创建:Thread、Runnable、Callable
.jpeg)
-
创建一个新的执行线程有两种方法: 自定义线程类继承Thread类;重写run()方法,编写线程执行体;创建线程对象,调用start()方法启动线程
-
将一个类声明为Thread 的子类。这个子类应该重写 run 类的方法Thread。然后可以分配并启子类的实例。例如,计算大于规定的素数的线程可以写成如下:
//创建线程方式一:1、继承Thread类,2、重写run()方法,3、调用start开启线程 public class TestThread1 extends Thread{ //继承Thread @Override //重写 public void run(){ super.run(); //run 方法线程体 for(int i = 0;i<20;i++){ System.out.println("我在看代码———"+i); } } public static void main(String[] args){ //main线程,主线程 //创建一个线程对象 TestThread1 testThread1 = new TestThread1(); //调用start()方法开启线程 testThread1.start(); for(int i = 0;i<20;i++){ System.out.println("我在学习多线程——"+i); } } }
总结:注意,线程开启不一定立即执行,由CPU调度执行。
//java文档里提供的代码 class primeThread extends Thread{ liong minPrime; primeThread(long minPrime){ this.minPrime = minPrime; } public void run(){ //compute primes larger than minPrime ... } } _______________________________________________ 然后,以下代码将创建一个线程并启动它运行: primeThread P = new PrimeThead(143); P.start();
-
另一种方法来创建一个线程是声明实现类Runnable接口。那个类然后实现了run方法。然后可以分配类的实例,在创建Thread时作为参数传递,并启动。这种其他风格的同一个例子如下所示:
//创建线程方式二:1.实现runnable接口,2.重写run方法,3.执行线程需要丢runnable接口实现类,调用start方法。 public class TestThread3 implements Runnable{ @Override public void run(){ //run方法线程体 for(int i = 0;i<200;i++){ System.out.println("我在看代码---"+i); } } public static viod main(String[] args){ /**创建线程对象,通过线程对象来开启我们的线程,代理 Thread thread = new Thread(testThread3); thread.start(); */ new Thread(testThread3).start(); for(int i = 0;i<1000;i++){ System.out.println("我在学习多线程---"+i); } } }
//JAVA 文档里提供的实现代码 class PrimeRun implements Runnable{ long minPrime; primeRun(long minPrime){ this.minPrime = minPrime; } public void run(){ // compute primes larger than minPrime ... } } //创建一个线程并启动它运行 PrimeRun p = new PrimeRun(); new Thead(p).start();
P4 如何实现多线程下载的案例代码
-