学习多线程(一)认识多线程

来源:互联网 发布:汽车导航端口修改器 编辑:程序博客网 时间:2024/05/22 09:51


进程:正在进行中的程序(直译).

线程:就是进程中一个负责程序执行的控制单元(执行路径)
一个进程中可以多执行路径,称之为多线程。

一个进程中至少要有一个线程。

开启多个线程是为了同时运行多部分代码。
每一个线程都有自己运行的内容。这个内容可以称为线程要执行的任务。

多线程好处:解决了多部分同时运行的问题。

多线程的弊端:线程太多回到效率的降低。
其实应用程序的执行都是cpu在做着快速的切换完成的。这个切换是随机的。
JVM启动时就启动了多个线程,至少有两个线程可以分析的出来。

1,执行main函数的线程,
该线程的任务代码都定义在main函数中。

2,负责垃圾回收的线程。

创建线程的目的是为了开启一条执行路径,去运行指定的代码和其他代码实现同时运行。

而运行的指定代码就是这个执行路径的任务。
jvm创建的主线程的任务都定义在了主函数中。
而自定义的线程它的任务在哪儿呢?
Thread类用于描述线程,线程是需要任务的。所以Thread类也对任务的描述。
这个任务就通过Thread类中的run方法来体现。也就是说,run方法就是封装自定义线程运行任务的函数。
run方法中定义就是线程要运行的任务代码。
开启线程是为了运行指定代码,所以只有继承Thread类,并复写run方法。
将运行的代码定义在run方法中即可。 

进程消失,线程必定消失,线程消失,进程不yiding。

Thread.currentThread().getName());

可以通过Thread的getName获取线程的名称

实现多线有三种方式(只说书里的2中)

第一:继承Thread类

package xiancheng;//多线程 会抢占cpu资源 public class ThreadDemo1 {public static void main(String[] args) {Demo1 d1= new Demo1("线程A");Demo1 d2= new Demo1("线程B");//start方法启动线程,其内部调用的还是run()方法,native java代码调用本机系统函数d1.start();//d1.start(); 如果一个线程已经启动啦,在调用start()方法,就会出错d2.start();System.out.println("哈哈");}}class Demo1 extends Thread{private String name;Demo1(String name){this.name=name;}public void run(){for(int i=0;i<10;i++){System.out.println(name+"运行,i="+i);}}}
结果如下:

线程A运行,i=0线程B运行,i=0线程B运行,i=1线程B运行,i=2线程B运行,i=3线程B运行,i=4线程B运行,i=5线程B运行,i=6线程B运行,i=7线程B运行,i=8线程B运行,i=9haha线程A运行,i=1线程A运行,i=2线程A运行,i=3线程A运行,i=4线程A运行,i=5线程A运行,i=6线程A运行,i=7线程A运行,i=8线程A运行,i=9

第二 实现Runnber接口

package xiancheng;public class ThreadName {public static void main(String[] args) {ThreadgetName t1 = new ThreadgetName();Thread t2 = new Thread(t1,"线程A");Thread t3 = new Thread(t1,"线程B");Thread t4 = new Thread(t1);Thread t5 = new Thread(t1);//调用start方法,最终调用的还是run()方法,可以看JDK源码,实现多线程是需要操作系统支持的!t4.start();t2.start();t3.start();t5.start();//也可以这样t1.run();}}class ThreadgetName implements Runnable{@Overridepublic void run() {for(int i=0;i<10;i++){System.out.println(Thread.currentThread().getName()+"运行,i="+i);}}}

运行结果:(这个没有达到并发,多运行几次)

main运行,i=0main运行,i=1main运行,i=2main运行,i=3main运行,i=4main运行,i=5main运行,i=6main运行,i=7main运行,i=8main运行,i=9Thread-0运行,i=0Thread-0运行,i=1Thread-0运行,i=2Thread-0运行,i=3Thread-0运行,i=4Thread-0运行,i=5Thread-0运行,i=6Thread-0运行,i=7Thread-0运行,i=8Thread-0运行,i=9线程B运行,i=0线程B运行,i=1线程B运行,i=2线程B运行,i=3线程B运行,i=4线程B运行,i=5线程B运行,i=6线程B运行,i=7线程B运行,i=8线程B运行,i=9线程A运行,i=0线程A运行,i=1线程A运行,i=2线程A运行,i=3线程A运行,i=4线程A运行,i=5线程A运行,i=6线程A运行,i=7线程A运行,i=8线程A运行,i=9Thread-1运行,i=0Thread-1运行,i=1Thread-1运行,i=2Thread-1运行,i=3Thread-1运行,i=4Thread-1运行,i=5Thread-1运行,i=6Thread-1运行,i=7Thread-1运行,i=8Thread-1运行,i=9
线程分5个状态:

/*Thread类 是Runnber接口的子类,Thread类完成比线程主体更多的任务,
分配CPU资源,判断是否已启动
Thread类无法达到资源共享的目的而Runnber可以
线程四个状态:
1就绪 Thread t1 = new Thread();
2 启动 start();
3 运行 run()方法
4阻塞  当前线程暂时执行交给其他线程
5 死亡状态
*/

判断线程是否启动成功:

package xiancheng;//判断线程是否启动成功public class isStart {public static void main(String[] args) {Demo5 d1= new Demo5();Thread t1 = new Thread(d1);System.out.println("线程开始执行之前:"+t1.isAlive());t1.start();System.out.println("线程执行之后:"+t1.isAlive());for(int i=0;i<3;i++){System.out.println("main方法运行:"+i);}System.out.println("for循环代码执行之后"+t1.isAlive());}}class Demo5 implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stubfor(int i=0;i<5;i++){System.out.println(Thread.currentThread().getName()+"运行,i="+i);}}}

结果:
线程开始执行之前:false线程执行之后:trueThread-0运行,i=0Thread-0运行,i=1Thread-0运行,i=2Thread-0运行,i=3Thread-0运行,i=4main方法运行:0main方法运行:1main方法运行:2for循环代码执行之后false









0 0
原创粉丝点击