多线程

来源:互联网 发布:网络直播举报 编辑:程序博客网 时间:2024/06/06 07:22
进程:就是应用程序在内存中分配的空间。(正在运行的程序)

线程:是进程中负责程序执行的执行单元,也成为执行路径。
一个进程中至少有一个线程在负责该进程的运行。
如果一个进程中出现了多个线程,就称该程序为多线程程序。

举例:运动场--鸟巢,水立方。

多线程技术:解决多部分代码同时执行的需求。可以合理的使用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
原创粉丝点击