多线程的实现有两种方法:1继承thread 2实现Runnable接口
个人总结如下;
一、继承thread
package com.iotek.threadtest;
public class HelloThreadDemo {
public static void main(String[] args) {
HelloThread h1=new HelloThread("A");
//h1.setName("线程1");
h1.start();
HelloThread h2=new HelloThread("B");
//h2.setName("线程2");
h2.start();
}
}
class HelloThread extends Thread{
public HelloThread(String name){
super(name);
}
@Override
public void run() {
for(int i=0;i<5;i++){
System.out.println(this.getName()+":"+i);
}
}
}
执行结果:A12345 B12345
二、Runnable接口
package com.iotek.threadtest;
public class HelloRunnableDemo {
public static void main(String[] args) {
HelloRunnable helloRunnable=new HelloRunnable();
Thread t1=new Thread(helloRunnable,"A");
t1.start();
Thread t2=new Thread(helloRunnable,"B");
t2.start();
}
}
//1.避免单继承的局限,一个类可以实现多个接口,但只能继承一个类
//2.适合资源的共享.
class HelloRunnable implements Runnable {
@Override
public void run() {
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
模仿车站窗口买票实例:
package com.iotek.threadtest;
public class SharedDataThreadDemo {
public static void main(String[] args) {
// TicketThread s1 = new TicketThread("一号窗口");
// s1.start();
// TicketThread s2 = new TicketThread("二号窗口");
// s2.start();
TicketRunnable runnable=new TicketRunnable();
Thread t1=new Thread(runnable, "一号窗口");
t1.start();
Thread t2=new Thread(runnable, "二号窗口");
t2.start();
}
}
// class TicketThread extends Thread{
// private int ticket=5;
// public TicketThread(String name){
// super(name);
// }
// @Override
// public void run() {
// while(true){
// System.out.println(this.getName()+":"+(ticket--));
// if(ticket<1){
// break;
// }
// }
// }
// }
class TicketRunnable implements Runnable {
private int ticket=5;
@Override
public void run() {
while (true) {
System.out.println(Thread.currentThread().getName() + ":" + (ticket--));
if (ticket < 1) {
break;
}
}
}
}
使用synchronized模拟银行取钱实例:
package com.iotek.synchronizedtest;
public class BankDemo {
public static void main(String[] args) {
Bank bank = new Bank();
BankThread p1 = new BankThread(bank);
p1.start();// 柜台取钱
BankThread p2 = new BankThread(bank);
p2.start();// ATM机上取钱
}
}
class BankThread extends Thread {
private Bank bank = null;
public BankThread(Bank bank) {
this.bank = bank;
}
@Override
public void run() {
System.out.println("取钱:" + bank.getMoney(400));
}
}
class Bank {
private int money = 500;
private Object obj=new Object();
// 取钱的方法,返回取钱的数目
// 当一个线程去调用同步方法的时候,这个线程就获取了当前对象的锁.
// 其它线程当调用同步方法的时候只能等待,因为无法获取对象的锁.
// 只有等第一个线程释放对象的锁方可进入
public int getMoney(int number) {
synchronized (obj) {
if (number < 0) {
return -1;
} else if (money < 0) {
return -2;
} else if (number - money > 0) {
return -3;
} else {
try {
Thread.sleep(1000);// 模拟取钱的时间
} catch (InterruptedException e) {
e.printStackTrace();
}
money -= number;
System.out.println("余额:" + money);
}
return number;
}
}
}