- 匿名内部类实现线程创建
-
package com.lagou.task18; public class ThreadNonameTest extends Thread{ public static void main(String[] args) { //匿名内部类的语法格式 父类/父类接口 变量名 = new 父类/父类接口{方法体}; //1.使用继承+匿名内部类的方式创建并启动线程 /*Thread t1 = new Thread(){ @Override public void run() { System.out.println("张三说:在吗?"); } }; t1.start();*/ new Thread(){ @Override public void run() { System.out.println("张三说:在吗?"); } }.start(); //2.使用实现接口+匿名内部类的方式创建并启动线程 /*Runnable rb = new Runnable() { @Override public void run() { System.out.println("李四说: 不在。"); } }; Thread t2 = new Thread(rb); t2.start();*/ /*new Thread(new Runnable() { @Override public void run() { System.out.println("李四说: 不在。"); } }).start();*/ //java8开始支持lambda表达式:(形参列表) ->{方法体;} /*Runnable rb = () -> System.out.println("李四说:不在"); new Thread(rb).start();*/ new Thread(() -> System.out.println("李四说:不在")).start(); } }
-
线程的生命周期
-
-
线程的编号和名称
-
-
继承的方式获取主线程的id
常用的方法
-
//当子线程不是守护线程时,,虽然主线程先结束了,但是子线程依然会继续执行,直到打印完毕所有数据时。 //当子线程时守护线程时,当主线程结束后,子线程会随之结束。
-
线程同步机制
package com.lagou.task18;
public class AccountRunnableTest implements Runnable{
private int balance ; //用于描述账余额
private Demo dm = new Demo();
public AccountRunnableTest() {
}
public AccountRunnableTest(int balance) {
setBalance(balance);
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
if (balance >= 0) {
this.balance = balance;
}else
System.out.println("请输入正确的账户");
}
@Override
public void run() {
System.out.println("线程" + Thread.currentThread().getName() + "已经启动");
synchronized (dm) {
//1.模拟从后台查询账户余额的过程
int temp = getBalance();
//2.模拟取款200元的过程
if (temp>=200){
System.out.println("正在出钞,请稍后。");
temp -=200;
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("请取走你的钞票!");
}else
System.out.println("余额不足");
//3.模拟将最新的账余额写入后台
setBalance(temp);
}
}
public static void main(String[] args) {
AccountRunnableTest account = new AccountRunnableTest(1000);
Thread t1 = new Thread(account);
Thread t2 = new Thread(account);
t1.start();
t2.start();
System.out.println("主线程开始等待:");
try {
t1.join();
//t2.start(); //也就是等待线程一取款操作结束后在启动线程二
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("最终的账户余额为:" + account.getBalance());
}
}
class Demo{
}
每个人都带着一把锁!要求必须是同一个对象