学习笔记 Java_毕向东_创建线程_同步代码块synchronized 2014.8.6

来源:互联网 发布:phpcms域名绑定目录 编辑:程序博客网 时间:2024/06/05 19:46

一、多线程

1、创建线程-继承Thread类

  1. 创建线程
    class Demo extends Thread{private String name;Demo(String name){//this.name = name;  super(name);  //为什么要用super才能把自己给线程取的名字传进来呢?}public void run(){for(int x = 0; x < 10; x++)System.out.println((Thread.currentThread() == this) + ".." + this.getName() + "demo..." + x);  } }class MyThreadDemo{public static void main(String[] args) {Demo d1 = new Demo("Thread-1");Demo d2 = new Demo("Thread-2");d1.start();d2.start();//d2.run();//d1.run();for(int x = 0; x < 10; x++)System.out.println("main..." + x);}}
  2. 售票程序
    class Ticket extends Thread{//private static int tick = 10;  //问题:static为什么就解决了呢?但是一般不静态(因为静态生命周期太长)int tick = 10;public void run(){//private static int tick = 10;  这个位置不能加private staticwhile(tick > 0){System.out.println(currentThread().getName() + "tick sale..." + tick--);}}}class MyTicketDemo {public static void main(String[] args) {Ticket t1 = new Ticket();Ticket t2 = new Ticket();t1.start();  //开启一个线程就有100张票t2.start();  //开启一个线程就有100张票}} 

2、创建线程-实现Runnable接口

  1. 售票程序
    class Ticket implements Runnable{private int tick = 10;public void run(){while(true){if(tick > 0)System.out.println(Thread.currentThread().getName() + "...tick sale..." + tick--);}}}class MyTicketDemo2 {public static void main(String[] args) {Ticket tick = new Ticket();Thread t1 = new Thread(tick);Thread t2 = new Thread(tick);Thread t3 = new Thread(tick);Thread t4 = new Thread(tick);t1.start();t2.start();t3.start();t4.start();}}

3、多线程的安全问题,同步代码块synchronized

  1. 售票程序,synchronized
    class Ticket implements Runnable{private int tick = 100;Object obj = new Object();public void run(){while(true){synchronized(obj){if(tick > 0){try{Thread.sleep(10);}catch (Exception e){}System.out.println(Thread.currentThread().getName() + "...tick sale..." + tick--);}}}}}class MyTicketDemo2 {public static void main(String[] args) {Ticket tick = new Ticket();Thread t1 = new Thread(tick);Thread t2 = new Thread(tick);Thread t3 = new Thread(tick);Thread t4 = new Thread(tick);t1.start();t2.start();t3.start();t4.start();}}
  2. 同步的前提:
    1,必须要有两个或者两个以上的线程。
    2,必须是多个线程使用同一个锁。
  3. 必须保证同步中只能有一个线程在运行。
  4. 好处:解决了多线程的安全问题。
  5. 弊端:多个线程需要判断锁,较为消耗资源

 

0 0
原创粉丝点击