多线程个人心得

多线程的实现有两种方法: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;
}

}
}

转载于:https://www.cnblogs.com/lisj-jiangshao/p/5892502.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值