《Java多线程开发方法2》由会员分享,可在线阅读,更多相关《Java多线程开发方法2(11页珍藏版)》请在金锄头文库上搜索。
1、Java多线程(一)多线程基础前言本文主要讲解java多线程的基础,以及一些常用方法。关于线程同步、ExecutorService框架我会放到后续的文章进行讲解。进程与线程的区别进程进程简单的来说就是在内存中运行的应用程序,一个进程可以启动多个线程。比如在windows中一个运行EXE文件就是一个进程。线程同一个线程中的进程共用相同的地址空间,同时共享进程所拥有的内存和其他资源。线程Demo-继承Thread类首先我们我们继承java.lang.Thread类来创建线程。package top.crosssoverjie.study.Thread;public class TestThread
2、 public static void main(String args) System.out.println(主线程ID是: + Thread.currentThread().getId(); MyThread my = new MyThread(线程1); my.start() ; MyThread my2 = new MyThread(线程2) ; /* * 这里直接调用my2的run()方法。 */ my2.run() ; class MyThread extends Thread private String name; public MyThread(String name) t
3、his.name = name; Override public void run() System.out.println(名字: + name + 的线程ID是= + Thread.currentThread().getId(); 输出结果:主线程ID是:1名字:线程2的线程ID是=1名字:线程1的线程ID是=9由输出结果我们可以得出以下结论: my和my2的线程ID不相同,my2和主线程ID相同。说明直接调用run()方法不会创建新的线程,而是在主线程中直接调用的run()方法,和普通的方法调用没有区别。 虽然my的start()方法是在my2的run()方法之前调用,但是却是后输出内容
4、,说明新建的线程并不会影响主线程的执行。线程Demo-实现Runnable接口除了继承java.lang.Thread类之外,我们还可以实现java.lang.Runnable接口来创建线程。package top.crosssoverjie.study.Thread;public class TestRunnable public static void main(String args) System.out.println(主线程的线程ID是+Thread.currentThread().getId(); MyThread2 my = new MyThread2(线程1) ; Threa
5、d t = new Thread(my) ; t.start() ; MyThread2 my2 = new MyThread2(线程2) ; Thread t2 = new Thread(my2) ; /* * 方法调用,并不会创建线程,依然是主线程 */ t2.run() ; class MyThread2 implements Runnable private String name ; public MyThread2(String name) this.name = name ; Override public void run() System.out.println(线程+nam
6、e+的线程ID是+Thread.currentThread().getId(); 输出结果:主线程的线程ID是1线程线程2的线程ID是1线程线程1的线程ID是9notes: 实现Runnable的方式需要将实现Runnable接口的类作为参数传递给Thread,然后通过Thread类调用Start()方法来创建线程。 这两种方式都可以来创建线程,至于选择哪一种要看自己的需求。直接继承Thread类的话代码要简洁一些,但是由于java只支持单继承,所以如果要继承其他类的同时需要实现线程那就只能实现Runnable接口了,这里更推荐实现Runnable接口。实际上如果我们查看Thread类的源码我
7、们会发现Thread是实现了Runnable接口的:线程中常用的方法序号方法介绍1public void start()使该线程执行,java虚拟机会调用该线程的run()方法。2public final void setName(String name)修改线程名称。3public final void setPriority(int privority)修改线程的优先级。4public final void setDaemon(false on)将该线程标记为守护线程或用户线程,当正在运行线程都是守护线程时,java虚拟机退出,该方法必须在启动线程前调用。5public final voi
8、d join(long mills)等待该线程的终止时间最长为mills毫秒。6public void interrupt()中断线程。7public static boolean isAlive()测试线程是否处于活动状态。如果该线程已经启动尚未终止,则为活动状态。8public static void yield()暂停当前线程执行的对象,并执行其他线程。9public static void sleep(long mills)在指定毫秒数内,让当前执行的线程休眠(暂停)。10public static Thread currentThread()返回当前线程的引用。方法详解- publi
9、c static void sleep(long mills) package top.crosssoverjie.study.Thread;public class TestSleep private int i = 10 ; private Object ob = new Object() ; public static void main(String args) TestSleep t = new TestSleep() ; MyThread3 thread1 = t.new MyThread3() ; MyThread3 thread2 = t.new MyThread3() ; t
10、hread1.start() ; thread2.start() ; class MyThread3 extends Thread Override public void run() synchronized (ob) i+ ; System.out.println(i的值:+i); System.out.println(线程:+Thread.currentThread().getName()+进入休眠状态); try Thread.currentThread().sleep(1000) ; catch (Exception e) e.printStackTrace(); System.ou
11、t.println(线程:+Thread.currentThread().getName()+休眠结束); i+; System.out.println(i的值:+i); 输出结果:i的值:11线程:Thread-0进入休眠状态线程:Thread-0休眠结束i的值:12i的值:13线程:Thread-1进入休眠状态线程:Thread-1休眠结束i的值:14由输出结果我们可以得出: 当Thread0进入休眠状态时,Thread1并没有继续执行,而是等待Thread0休眠结束释放了对象锁,Thread1才继续执行。当调用sleep()方法时,必须捕获异常或者向上层抛出异常。当线程休眠时间满时,并不
12、一定会马上执行,因为此时有可能CPU正在执行其他的任务,所以调用了sleep()方法相当于线程进入了阻塞状态。方法详解- public static void yield() package top.crosssoverjie.study.Thread;public class Testyield public static void main(String args) MyThread4 my = new MyThread4() ; my.start() ; class MyThread4 extends Thread Override public void run() long open = System.currentTimeMillis(); int count= 0 ; for(int i=0 ;i1000000;i+) count= count+(i+1);/ Thread.yield() ; long end = System.currentTimeMillis(); System.out.println(用时:+(end-open)+毫秒); 输出结果:用时:1毫秒如果将 Thread.yield()注释取消掉,输出结果:用时:116毫秒