黑马程序员----多线程

来源:互联网 发布:海平面上升最新数据 编辑:程序博客网 时间:2024/06/08 06:03

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

多线程有两种方式:1,继承Thread 2实现一个接口Runnable。

第一种方式步骤: 
1,定义类继承Thread类; 
2,目的是复写run方法,将要让线程运行的代码都存储到run方法中; 
3,通过创建Thread类的子类对象,创建线程

4,调用线程的start方法,开启线程,并执行run方法。 

/*class ThreadTest{public static void main(String[] args) {PrintThread p1 = new PrintThread("2222");PrintThread p2 = new PrintThread("444");p1.start();p2.start();}}class PrintThread extends Thread{PrintThread(String name){super(name);}public void run(){for (int x=0;x<100 ;x++ ){System.out.println(Thread.currentThread().getName()+"    x="+x);}}}*/class PrintThread implements Runnable{Object obj = new Object();private int tick=800;public void run(){while(true){synchronized(this){if(tick>0){try{Thread.sleep(10);}catch(Exception e){}System.out.println(Thread.currentThread().getName()+"  tick="+tick--);}elsebreak;}}}}class ThreadTest{public static void main(String[] args) {PrintThread p = new PrintThread();Thread p1 = new Thread(p);Thread p2 = new Thread(p);Thread p3 = new Thread(p);Thread p4 = new Thread(p);p1.start();p2.start();p3.start();p4.start();}}



 第二种方式步骤: 

1,定义类实现Runnable接口。 
2,覆盖接口中的run方法(用于封装线程要运行的代码)。 
3,通过Thread类创建线程对象; 
4,将实现了Runnable接口的子类对象作为实际参数传递给Thread类中的构造函数。  

5,调用Thread对象的start方法。开启线程,并运行Runnable接口子类中的run方法。 

class InputOutputDemo{public static void main(String[] args) {res r = new res();new Thread(new Input(r)).start();new Thread(new Output(r)).start();}}class res{String name;String sex;boolean flog = false;}class Input implements Runnable{private res r;Input(res r){this.r=r;}public void run(){int x = 0;while(true){synchronized(r){if (r.flog){try{r.wait();}catch (Exception e){}}if (x==1){r.name="mike";r.sex="man";}else{r.name="丽丽";r.sex="女";}r.flog = true;x=(x+1)%2;r.notify();}}}}class Output implements Runnable{private res r;Output(res r){this.r= r;}public void run(){while(true){synchronized(r){if (!r.flog){try{r.wait();}catch (Exception e){}}System.out.println(r.name+"========"+r.sex);r.flog = false;r.notify();}}}}



多线程安全问题的原因:
一个线程在执行多条语句时,并运算同一个数据时,在执行过程中,其他线程参与进来,并操作了这个数据。导致到了错误数据的产生。

死锁练习

public class TestDeadLock implements Runnable        {                public int flag = 3;                public static Object o1 = new Object();                public static Object o2 = new Object();                public void run()                        {                              System.out.println("flag:"+flag);                                 if (flag == 1)                                        {                                                 synchronized (o1)                                                        {                                                                try                                                                        {                                                                                Thread.sleep(10);                                                                        } catch (InterruptedException e)                                                                        {                                                                                e.printStackTrace();                                                                        }                                                                synchronized (o2)                                                                        {                                                                                System.out.println("111");                                                                        }                                                        }                                        } else if (flag == 0)                                        {                                                 synchronized (o2)                                                        {                                                                try                                                                        {                                                                                Thread.sleep(10);                                                                        } catch (InterruptedException e)                                                                        {                                                                                e.printStackTrace();                                                                        }                                                                synchronized (o1)                                                                        {                                                                                System.out.println("000");                                                                        }                                                        }                                        }                        }                public static void main(String[] args)                        {                                TestDeadLock td1 = new TestDeadLock();                                TestDeadLock td2 = new TestDeadLock();                                td1.flag = 1;                                td2.flag = 0;                                Thread t1 = new Thread(td1);                                Thread t2 = new Thread(td2);                                t1.start();                                t2.start();                        }        }

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------




0 0