多线程
来源:互联网 发布:网络直播举报 编辑:程序博客网 时间:2024/06/06 07:22
进程:就是应用程序在内存中分配的空间。(正在运行的程序)
线程:是进程中负责程序执行的执行单元,也成为执行路径。
一个进程中至少有一个线程在负责该进程的运行。
如果一个进程中出现了多个线程,就称该程序为多线程程序。
举例:运动场--鸟巢,水立方。
多线程技术:解决多部分代码同时执行的需求。可以合理的使用cpu资源。
增加用户体验感。
多线程的运行根据CPU的切换完成的,怎么切换CPU说的算,
所以多线程运行有一个随机性(CPU快速切换造成的)。
jvm中的多线程:
至少有两个线程:一个负责自定义代码运行,一个是负责垃圾回收的。
之所以创建一个线程就是为了去运行指定的任务代码。
而线程的任务都封装在特定的区域中。
比如:
主线程运行的任务都绑定在main方法中。
垃圾回收线程在收垃圾时都会运行finalize方法。
实现Runnable接口:
实现Runnable接口的好处:
1.避免了继承Thread类的单继承的局限性。
2.Runnable接口的出现更符合面向对象的思想,将线程单独进行对象的封装。
3.Runnable接口的出现,降低了线程对象和线程任务的耦合性。
所以,以后创建线程都使用第二种方式。
线程:是进程中负责程序执行的执行单元,也成为执行路径。
一个进程中至少有一个线程在负责该进程的运行。
如果一个进程中出现了多个线程,就称该程序为多线程程序。
举例:运动场--鸟巢,水立方。
多线程技术:解决多部分代码同时执行的需求。可以合理的使用cpu资源。
增加用户体验感。
多线程的运行根据CPU的切换完成的,怎么切换CPU说的算,
所以多线程运行有一个随机性(CPU快速切换造成的)。
jvm中的多线程:
至少有两个线程:一个负责自定义代码运行,一个是负责垃圾回收的。
这个从main方法开始执行的线程称之为主线程。
public class Demo {public static void main(String[] args) {new Demo1();new Demo1();new Demo1();new Demo1();System.gc();System.out.println("Hello world!!");}}class Demo1{public void finalize() {System.out.println("Demo ok!");}}每一个线程都有运行的代码内容,这个称之为线程的任务。
之所以创建一个线程就是为了去运行指定的任务代码。
而线程的任务都封装在特定的区域中。
比如:
主线程运行的任务都绑定在main方法中。
垃圾回收线程在收垃圾时都会运行finalize方法。
自己创建的线程任务则存在于run方法中。
调用start和调用run有什么区别?
调用start可以开启线程,让开启的线程运行run方法中的线程任务,调用run不会开启线程,执行run方法的只有主线程在执行。
调用start,run里面执行的是自定义的线程对象,调用run,run方法里面执行的是主线程。
创建线程的第一种方式:
继承Thread类:
public class Demo {public static void main(String[] args) {ThreadDemo d1 = new ThreadDemo("张三");ThreadDemo d2 = new ThreadDemo("李四");d1.start();d2.start();for (int i = 0; i < 40; i++) {System.out.println(Thread.currentThread().getName()+"--"+"main"+"..."+i);}}}class ThreadDemo extends Thread{private String name;ThreadDemo(String name){this.name = name;}@Overridepublic void run() {show();}public void show(){for(int i = 0; i < 10;i++){System.out.println(getName()+name+"..."+i);}}}创建线程的第二种方式:
实现Runnable接口:
public class TicketDemo {public static void main(String[] args) {SaleTicket s = new SaleTicket();Thread t = new Thread(s);Thread t1 = new Thread(s);Thread t2 = new Thread(s);Thread t3 = new Thread(s);t.start();t1.start();t2.start();t3.start();}}class SaleTicket implements Runnable{private int tickets = 100;public void run(){while(tickets>0){System.out.println(Thread.currentThread().getName()+"..."+tickets--);}}}
实现Runnable接口的好处:
1.避免了继承Thread类的单继承的局限性。
2.Runnable接口的出现更符合面向对象的思想,将线程单独进行对象的封装。
3.Runnable接口的出现,降低了线程对象和线程任务的耦合性。
所以,以后创建线程都使用第二种方式。
多线程的状态图:
0 0
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- 多线程
- ZZULIOJ 1919 D
- mysql命令行操作
- java取模数据格式转换源码 宽高16*16 高位在前 转为 低位在前
- HDU 2122 Ice_cream’s world III 两种最小生成树算法
- rabbitmq 3.6 安装
- 多线程
- js 各类型和bool型比较
- liferay学习2--用户体系及权限体系简单说明
- 基于注解的spring mvc controller
- GPCC修改默认登出时间
- My_String类案例(构造、析构、重载'=' '[]' '<<' '==' '!=' '>' '<' '>>' 运算、操作符以及其他技巧)(重载完结)
- JavaScript中如何严格的判断NaN
- java中实现数组转化为字符串
- PAT(B).1028. 人口普查(20)