Java多线程简单入门
多线程的实现方式:
1.继承自Thread类
public class MyThread extends Thread { public MyThread(String name) { super(name); } @Override public void run() { for (int i= 0; i<10;i++){ System.out.println(getName() + "-->" +i); } } }
public static void main(String[] args) { MyThread thread = new MyThread("thread-name"); thread.start(); }
运行结果:
2.实现Runnable接口
public class MyRunnable implements Runnable { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + "--->" + i); } } }
public static void main(String[] args) { MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable,"thread"); thread.start(); }
线程不安全,多个线程同时竞争一个资源,模拟一个售票的过程:
public class TicketSeller implements Runnable { private int ticket = 100; //设置线程任务:卖票 @Override public void run() { while(true){ if(ticket>0){ try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } //票存在,卖票 ticket-- System.out.println(Thread.currentThread().getName()+"-->正在卖第"+ticket+"张票"); ticket--; }else{
break;
} } }
public static void main(String[] args) { TicketSeller ticketSeller = new TicketSeller(); Thread t1 = new Thread(ticketSeller, "售票员1"); Thread t2 = new Thread(ticketSeller, "售票员2"); Thread t3 = new Thread(ticketSeller, "售票员3"); t1.start(); t2.start(); t3.start(); }
存在同一张票多次售卖或买超了的情况,这就是线程不安全造成的,多个线程同时修改一个变量。
如何保持线程同步?
- 同步代码块
- 不同方法
- 锁机制
同步代码块
public class TicketSeller implements Runnable { private int ticket = 100; Object lock = new Object(); //设置线程任务:卖票 @Override public void run() { synchronized (lock){ while(true){ if(ticket>0){ try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } //票存在,卖票 ticket-- System.out.println(Thread.currentThread().getName()+"-->正在卖第"+ticket+"张票"); ticket--; }else { break; } } } } }
同步方法:
public synchronized void methodName(){ //可能会产生线程安全的代码 }
锁机制
Lock lock1 = new ReentrantLock(); public void lockMethod(){ lock1.lock(); //可能会产生线程安全问题的代码 lock1.unlock(); }
运行结果:
线程安全问题解决