在多线程中所有的操作方法都是从Thread类开始的,所有的操作基本都在Thread类中。
第一取得线程名字
a,在Thread类中,可以通过getName()方法,获得线程的名字,可以通过setName()方法设置线程的名字
b,线程名字一般在线程启动前设置,但是也允许为已经运行的线程设置名称,允许2个Thread对象有相
同的名字,但是不推荐,你懂的!!!
c,如果程序没有为线程指定名字,则系统自动为线程分配一个名称。
package xianchengcaozuo; public class ThreadName { public static void main(String[] args) { Demo d1= new Demo(); Thread t1= new Thread(d1); Thread t2= new Thread(d1,"线程A"); Thread t3= new Thread(d1,"线程B"); Thread t4= new Thread(d1); t1.start(); t2.start(); t3.start(); t4.start(); } } class Demo implements Runnable{ @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<5;i++){ System.out.println(Thread.currentThread().getName()+"运行,i="+i); } } }
Thread-0运行,i=0 Thread-0运行,i=1 Thread-0运行,i=2 线程A运行,i=0 线程A运行,i=1 线程A运行,i=2 Thread-0运行,i=3 Thread-0运行,i=4 线程A运行,i=3 线程A运行,i=4 线程B运行,i=0 线程B运行,i=1 线程B运行,i=2 线程B运行,i=3 线程B运行,i=4 Thread-1运行,i=0 Thread-1运行,i=1 Thread-1运行,i=2 Thread-1运行,i=3 Thread-1运行,i=4
没指定名字,则按编号!!
第二 获取当前线程对象currentThread()
第三判断线程是否启动成功 isAlive()
第四 强制运行线程
package xianchengcaozuo; /* * 强制运行线程用join方法,期间其它线程无法运行,必须等待此线程 * 执行完后,其它线程才可以执行 */ public class Qiangzhi { public static void main(String[] args) { Demo1 d1= new Demo1(); Thread t1= new Thread(d1,"线程A"); t1.start(); for(int i=0;i<50;i++){ if(i>10){ try { t1.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("main线程运行:"+i); } } } class Demo1 implements Runnable{ @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<50;i++){ System.out.println(Thread.currentThread().getName()+"运行,i="+i); } } }
结果:
main线程运行:0 main线程运行:1 main线程运行:2 main线程运行:3 main线程运行:4 main线程运行:5 main线程运行:6 main线程运行:7 main线程运行:8 main线程运行:9 main线程运行:10 线程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=9 线程A运行,i=10 线程A运行,i=11 线程A运行,i=12 线程A运行,i=13 线程A运行,i=14 线程A运行,i=15 线程A运行,i=16 线程A运行,i=17 线程A运行,i=18 线程A运行,i=19 线程A运行,i=20 线程A运行,i=21 线程A运行,i=22 线程A运行,i=23 线程A运行,i=24 线程A运行,i=25 线程A运行,i=26 线程A运行,i=27 线程A运行,i=28 线程A运行,i=29 线程A运行,i=30 线程A运行,i=31 线程A运行,i=32 线程A运行,i=33 线程A运行,i=34 线程A运行,i=35 线程A运行,i=36 线程A运行,i=37 线程A运行,i=38 线程A运行,i=39 线程A运行,i=40 线程A运行,i=41 线程A运行,i=42 线程A运行,i=43 线程A运行,i=44 线程A运行,i=45 线程A运行,i=46 线程A运行,i=47 线程A运行,i=48 线程A运行,i=49 main线程运行:11 main线程运行:12 main线程运行:13 main线程运行:14 main线程运行:15 main线程运行:16 main线程运行:17 main线程运行:18 main线程运行:19 main线程运行:20 main线程运行:21 main线程运行:22 main线程运行:23 main线程运行:24 main线程运行:25 main线程运行:26 main线程运行:27 main线程运行:28 main线程运行:29 main线程运行:30 main线程运行:31 main线程运行:32 main线程运行:33 main线程运行:34 main线程运行:35 main线程运行:36 main线程运行:37 main线程运行:38 main线程运行:39 main线程运行:40 main线程运行:41 main线程运行:42 main线程运行:43 main线程运行:44 main线程运行:45 main线程运行:46 main线程运行:47 main线程运行:48 main线程运行:49
第五 线程的休眠
package xianchengcaozuo; import java.util.Date; /* * 通过sleep方法,可以使线程暂停执行 * */ public class ThreadSleep { public static void main(String[] args) { Demo2 d1= new Demo2(); Thread t1= new Thread(d1,"线程C"); t1.start(); } } class Demo2 implements Runnable{ @Override public void run() { for(int i=0;i<10;i++){ try { //此处是毫秒 Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(new Date()); System.out.println(Thread.currentThread().getName()+"运行,i="+i); } } }
Tue Apr 22 11:10:40 CST 2014 线程C运行,i=0 Tue Apr 22 11:10:45 CST 2014 线程C运行,i=1 Tue Apr 22 11:10:50 CST 2014 线程C运行,i=2 Tue Apr 22 11:10:55 CST 2014 线程C运行,i=3 Tue Apr 22 11:11:00 CST 2014 线程C运行,i=4
线程终止:
如果主线程是5000,那么会先run正常,在被终止
package xianchengcaozuo; //当一个线程运行的时候,另一个线程可以通过interrupt方法种植其线程. class MyThread09 implements Runnable { public void run() { System.out.println("1、进入run方法"); for (int i = 0; i < 5; i++) { try { Thread.sleep(5000); System.out.println("2、休眠已经完成"); } catch (Exception e) { System.out.println("3、休眠被终止"); return; } System.out.println("4、run方法正常结束"); } } } class Threadinterrupt{ public static void main(String[] args) { MyThread09 my = new MyThread09(); Thread t = new Thread(my,"线程"); t.start(); try { Thread.sleep(2000); } catch (Exception e) { } t.interrupt(); } }
1、进入run方法
3、休眠被终止
线程的优先级:
package xianchengcaozuo; public class Threadjibie { public static void main(String[] args) { Demo5 my = new Demo5(); Thread t1 = new Thread(my,"线程A"); Thread t2 = new Thread(my,"线程B"); Thread t3 = new Thread(my,"线程C"); //设置线程优先级 t1.setPriority(Thread.MIN_PRIORITY); t2.setPriority(Thread.NORM_PRIORITY); t3.setPriority(Thread.MAX_PRIORITY); t1.start(); t2.start(); t3.start(); } } class Demo5 implements Runnable { public void run() { for (int i = 0; i < 5; i++) { try { Thread.sleep(500); } catch (Exception e) { } System.out.println(Thread.currentThread().getName() + "运行,i = " + i); } } }
线程C运行,i = 0 线程B运行,i = 0 线程A运行,i = 0 线程C运行,i = 1 线程B运行,i = 1 线程A运行,i = 1 线程C运行,i = 2 线程B运行,i = 2 线程A运行,i = 2 线程C运行,i = 3 线程B运行,i = 3 线程A运行,i = 3 线程C运行,i = 4 线程B运行,i = 4 线程A运行,i = 4
主方法的优先级是中级
线程的礼让:
package xianchengcaozuo; //yield(),线程礼让,将操作让给其它线程 public class ThreadLirang { public static void main(String[] args) { Demo6 d1= new Demo6(); Thread t1 = new Thread(d1); Thread t2 = new Thread(d1); t1.start(); t2.start(); } } class Demo6 implements Runnable{ @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<5;i++){ System.out.println(Thread.currentThread().getName()+"运行,i="+i); if(i==3){ Thread.currentThread().yield(); System.out.println(Thread.currentThread().getName()+"礼让"); } } } }
结果: Thread-1运行,i=0
Thread-1运行,i=1
Thread-1运行,i=2
Thread-1运行,i=3
Thread-0运行,i=0
Thread-0运行,i=1
Thread-0运行,i=2
Thread-0运行,i=3
Thread-0礼让
Thread-0运行,i=4
Thread-1礼让
Thread-1运行,i=4