我不是程序员—小白线程案例
1.线程创建:(案例)
继承Thread类
//打印和计数
public class TestThread {
public TestThread() {
PrintChar pc = new PrintChar('A', 12);
PrintNum pn = new PrintNum(12);
pc.start();
pn.start();
}
public static void main(String[] args) {
new TestThread();
}
class PrintChar extends Thread{
private char c;
private int num;
public PrintChar(char c ,int num) {
this.c = c;
this.num = num;
}
@Override
public void run() {
for(int i=0;i<num;i++) {
System.out.print(c);
}
}
}
class PrintNum extends Thread{
private int num;
public PrintNum(int num) {
this.num = num;
}
@Override
public void run() {
for(int i=0;i<num;i++) {
System.out.print(i);
}
}
}
}
执行结果:
AAAAAAAAAAAA01234567891011
实现Runable接口:
//模拟银行取款
public class TestAccount {
public static void main(String[] args) {
ChangeBalance c = new ChangeBalance();
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
t1.start();
t2.start();
}
}
class Account{
int id=0;
double balance = 5000;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
}
class ChangeBalance implements Runnable{
Account account = new Account();
public synchronized void getBalance(double amount) {
String name = Thread.currentThread().getName();
System.out.println("线程名:"+name);
if(amount<account.getBalance()) {
System.out.println("余额足够");
System.out.println("开始取钱"+amount);
account.setBalance(account.getBalance()-amount);
System.out.println("取钱成功,余额为:"+account.getBalance());
}else {
System.out.println("余额不足");
}
}
@Override
public void run() {
getBalance(3000);
}
}
运行结果:
线程名:Thread-0
余额足够
开始取钱3000.0
取钱成功,余额为:2000.0
线程名:Thread-1
余额不足
2.多线程买票问题
//买票问题
public class Test12306 {
public static void main(String[] args) {
Method m = new Method();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
m.m1();
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
m.m2();
}
});
t1.start();
t2.start();
}
}
class Method{
synchronized void m1() {
for(int i=0;i<5;i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
synchronized void m2() {
for(int i=0;i<5;i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
运行结果:
Thread-0:0
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4
Thread-1:0
Thread-1:1
Thread-1:2
Thread-1:3
Thread-1:4
3.Lock的简单使用
public class LockTest {
public static void main(String[] args) {
LockDemo demo = new LockDemo();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
demo.add();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
demo.add();
}
}).start();
}
}
class LockDemo{
Lock lock = new ReentrantLock();
void add() {
lock.lock();
try {
System.out.println(Thread.currentThread()+"得到锁");
Thread.sleep(1000);
for(int i=0;i<5;i++) {
System.out.println(i+";");
}
} catch (Exception e) {
// TODO: handle exception
}finally {
System.out.println(Thread.currentThread()+"释放锁");
lock.unlock();
}
}
}
运行结果:
Thread[Thread-0,5,main]得到锁
0;
1;
2;
3;
4;
Thread[Thread-0,5,main]释放锁
Thread[Thread-1,5,main]得到锁
0;
1;
2;
3;
4;
Thread[Thread-1,5,main]释放锁