标签:
1.创建线程方式:
(1)继承Thread,并重写run方法
1 public class ThreadDemo01 { 2 public static void main(String[] args) { 3 MyThread1 t1=new MyThread1(); 4 MyThread2 t2=new MyThread2(); 5 t1.start(); 6 t2.start(); 7 } 8 } 9 class MyThread1 extends Thread{ 10 public void run(){ 11 for(int i=0;i<100;i++){ 12 System.out.println("你好吗?"); 13 } 14 } 15 } 16 class MyThread2 extends Thread{ 17 public void run(){ 18 for(int i=0;i<100;i++){ 19 System.out.println("我很好"); 20 } 21 } 22 }
由于java是单继承的,所以在一个项目中,常常 会让一个类去指定扩展一个父类,但若这个类还需要
实现线程的功能,就会导致产生继承冲突。
(2)实现Runnable接口来单独定义线程任务
1 public class ThreadDemo02 { 2 public static void main(String[] args) { 3 Runnable r1=new MyRunnable1(); 4 Runnable r2=new MyRunnable2(); 5 6 Thread t1=new Thread(r1); 7 Thread t2=new Thread(r2); 8 t1.start(); 9 t2.start(); 10 } 11 } 12 class MyRunnable1 implements Runnable{ 13 public void run(){ 14 for(int i=0;i<100;i++){ 15 System.out.println("你是谁?"); 16 } 17 } 18 } 19 class MyRunnable2 implements Runnable{ 20 public void run(){ 21 for(int i=0;i<100;i++){ 22 System.out.println("我是查电表的"); 23 } 24 } 25 }
(3)使用匿名内部类-多使用第一种创建线程
1 public class ThreadDemo03 { 2 public static void main(String[] args) { 3 Thread t1=new Thread(){ 4 public void run(){ 5 for(int i=0;i<100;i++){ 6 System.out.println("你是谁?"); 7 } 8 } 9 }; 10 t1.start(); 11 Runnable runn=new Runnable(){ 12 public void run(){ 13 for(int i=0;i<100;i++){ 14 System.out.println("我是查水表的"); 15 } 16 } 17 }; 18 Thread t2=new Thread(runn); 19 t2.start(); 20 } 21 }
2、获取运行该方法的线程
1 public class ThreadDemo04 { 2 public static void main(String[] args) { 3 Thread t1=Thread.currentThread(); 4 System.out.println("运行main方法的线程:"+t1); 5 } 6 }
3.设置线程的优先级
1 ublic class ThreadDemo06 { 2 public static void main(String[] args) { 3 Thread min=new Thread(){ 4 public void run(){ 5 for(int i=0;i<10000;i++){ 6 System.out.println("min"); 7 } 8 } 9 }; 10 min.setPriority(Thread.MIN_PRIORITY); 11 min.start(); 12 } 13 }
4.join()方法:使调用该方法的线程进入阻塞状态,直到其等待的线程结束为止。
1 public class TreadDemo01 { 2 //模拟是否下载完毕的一个状态 3 private static boolean isFinish=false; 4 public static void main(String[] args) { 5 //错误1:忘记将局部变量写成final,否则内部类不能调用该方法中的局部变量 6 final Thread download=new Thread(){ 7 public void run(){ 8 System.out.println("download:图片已经开始下载.."); 9 for(int i=0;i<=100;i++){ 10 System.out.println("download:图片下载了"+i+"%"); 11 //错误2:Thread.sleep(50)应该写在写在for循环中,即表示当前线程堵塞50毫秒,(相当于延时) 12 try { 13 Thread.sleep(50); 14 } catch (InterruptedException e) { 15 } 16 } 17 18 System.out.println("download:图片已经下载完毕.."); 19 //错误3:忘记将isFinish重置成true 20 isFinish=true; 21 } 22 }; 23 Thread show=new Thread(){ 24 public void run(){ 25 System.out.println("show:图片已经开始显示.."); 26 try { 27 /* 28 * 当一个方法的局部内部类中想引用当前方法 29 * 的其他局部变量,那么该变量必须是final的 30 */ 31 download.join(); 32 // Thread.sleep(50); 33 } catch (InterruptedException e) { 34 } 35 36 //错误4:忘记判断isFinish,抛出异常状态 37 if(!isFinish){ 38 throw new RuntimeException("没有图片下载完毕"); 39 } 40 System.out.println("show:图片已经显示完毕.."); 41 } 42 }; 43 download.start(); 44 show.start(); 45 } 46 }
总结:看的懂代码并不代表真的能写代码,上面就是活活生生的例子!!!
6.synchronized块-解决多线程的并发安全问题就是将各干各的变为有顺序的先后做某事。
1 public class SynDemo02 {
2 public static void main(String[] args) {
3 final Shop shop=new Shop();
4 Thread t1=new Thread(){
5 public void run(){
6 shop.buy();
7 }
8 };
9 Thread t2=new Thread(){
10 public void run(){
11 shop.buy();
12 }
13 };
14 t1.start();
15 t2.start();
16 }
17 }
18 class Shop{
19 public void buy(){
20 Thread t=Thread.currentThread();
21 System.out.println(t+"正在挑选衣服..");
22 try {
23 Thread.sleep(5000);
24 //错误1:不记得怎么写了
25 // synchronized(){
26 //锁对象要保证多个线程看到的是同一个才具有通过效果,通常使用this
27 synchronized(this){
28 System.out.println(t+"正在试衣服..");
29 Thread.sleep(5000);
30 }
31 System.out.println(t+"结账离开");
32 } catch (InterruptedException e) {
33
34 }
35 }
36 }
synchronized块若声明在方法上,那么上锁的对象就是当前方法所属的对象(this)
互斥锁:当使用synchronized为两段不同的代码上锁,而多个线程看到的是相同的锁对象时,那么,这两段代码间就具有了互斥效果(多个线程间不能同时进入到 两个方法内部)
1 public class SyncDemo03 { 2 public static void main(String[] args) { 3 final Foo foo=new Foo(); 4 Thread t1=new Thread(){ 5 public void run(){ 6 foo.methodA(); 7 } 8 }; 9 Thread t2=new Thread(){ 10 public void run(){ 11 foo.methodB(); 12 } 13 }; 14 t1.start(); 15 t2.start(); 16 } 17 18 } 19 class Foo{ 20 public synchronized void methodA(){ 21 try { 22 Thread t1=Thread.currentThread(); 23 System.out.println(t1+"正在调用A方法"); 24 Thread.sleep(5000); 25 System.out.println("运行A方法结束"); 26 } catch (InterruptedException e) { 27 28 } 29 } 30 public synchronized void methodB(){ 31 try { 32 Thread t1=Thread.currentThread(); 33 System.out.println(t1+"正在调用B方法"); 34 Thread.sleep(5000); 35 System.out.println("运行B方法结束"); 36 } catch (InterruptedException e) { 37 } 38 } 39 }
7.Object定义了两个方法wait()和notify()
(1)wait方法可以阻塞调用该方法的线程,直到该对象的
(2) notify方法被调用,才能解除线程的阻塞状态。
1 private static Object obj = new Object(); 2 synchronized (obj) { 3 obj.notify(); 4 }
标签:
原文地址:http://www.cnblogs.com/liuxu0310/p/5031264.html