java 多线程一

  • 在java中如何创建多线程?

      在java中创建多线程有两种方法1.将一个类声明为Thread的子类,然后重写run()方法。2.将一个类实现Runnable接口,实现run()方法。

      下面是创建多线程代码:

 1 package Thread;
 2 
 3 public class TestThread {
 4 
 5     public static void main(String[] args) {
 6         Thread1 t1 = new Thread1("A");
 7         Thread1 t2 = new Thread1("B");
 8         t1.start();
 9         t2.start();
10     }
11 
12 }
13 
14 class Thread1 extends Thread {
15     private String name;
16 
17     Thread1(String name) {
18         this.name = name;
19     }
20 
21     @Override
22     public void run() {
23         for (int i = 0; i < 10; i++)
24             System.out.println(name+"......i=" + i);
25     }
26 
27 }

这是继承Thread类,还有是实现Runnable接口。

 1 package Thread;
 2 
 3 public class TestThread {
 4 
 5     public static void main(String[] args) {
 6         Demo d = new Demo();
 7         Thread t1 = new Thread(d);
 8         Thread t2 = new Thread(d);
 9         t1.start();
10         t2.start();
11     }
12 
13 }
14 
15 class Demo implements Runnable {
16 
17     @Override
18     public void run() {
19         for (int i = 0; i < 100; i++)
20             System.out.println(Thread.currentThread().getName() + "......i=" + i);
21     }
22 
23 }

 实现Runnable接口的好处:1.java是单继承,如果一个类已经有了父类,则不能继承Thread类。2.如果一个类只想实现多线程任务而又不必要有Thread类的属性,可以通过Runnable实现多线程任务。所以一般创建线程用第二种方法。

  • 多线程中的线程安全问题

 多个线程共同操作一个共享变量就会出现数据的错误,线程同步的一个经典问题买票。

 1 package Thread;
 2 
 3 class Ticket implements Runnable {
 4     private int num = 5;
 5 
 6     @Override
 7     public void run() {
 8         while (true) {
 9             if (num > 0){
10                 try{Thread.sleep(10);} catch(InterruptedException e){};
11                 System.out.println(num--);
12                 }
13         }
14 
15     }
16 
17 }
18 
19 public class TicketDemo {
20 
21     public static void main(String[] args) {
22           Ticket t=new Ticket();
23           Thread t1=new Thread(t);
24           Thread t2=new Thread(t);
25           Thread t3=new Thread(t);
26           Thread t4=new Thread(t);
27           t1.start();
28           t2.start();
29           t3.start();
30           t4.start();
31     }
32 
33 }

 

运行结果
5
4
3
2
1
0
-1
-2

之所以会出现负票是应为一个线程在执行的过程中被切换执行另一个线程了,导致共享变量出现错误,java中可以用线程同步解决。用到关键字 synchronized.

synchronized(对象){

代码块

},其中对象就相当于Lock

package Thread;

class Ticket implements Runnable {
    private int num = 5;
    private Object obj=new Object();
    @Override
    public void run() {
        while (true) {
            synchronized(obj){
            if (num > 0){
                try{Thread.sleep(10);} catch(InterruptedException e){};
                System.out.println(num--);
                }
            }
        }

    }

}

public class TicketDemo {

    public static void main(String[] args) {
          Ticket t=new Ticket();
          Thread t1=new Thread(t);
          Thread t2=new Thread(t);
          Thread t3=new Thread(t);
          Thread t4=new Thread(t);
          t1.start();
          t2.start();
          t3.start();
          t4.start();
    }

}

解决线程同步问题,还可以使用同步函数,在需要的同步函数上加上关键字synchronized。

public synchronized void show() { }

 

posted on 2015-03-27 11:30  seize the day  阅读(134)  评论(0编辑  收藏  举报