package demo3;
//观察测试线程的状态
public class teststate {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Thread t = new Thread(()-> {
for(int i=0;i<5;i++)
{
try {
Thread.sleep(1000);
}catch(InterruptedException e)
{
e.printStackTrace();
}
}
System.out.println("..........");
});
//观察状态
Thread.State state = t.getState();
System.out.println(state);//NEW
//观察启动后
t.start();//启动线程
state = t.getState();
System.out.println(state);
while(state!= Thread.State.TERMINATED)//线程不是终止状态
{
Thread.sleep(100);
state = t.getState();//更新状态
System.out.println(state);
}
t.start();//停止之后就不能启动了
}
}
package demo3;
//测试线程的优先级
public class TestPriority {
public static void main(String[] args) {
// TODO Auto-generated method stub
//主线程默认的优先级
System.out.println(Thread.currentThread().getName()+"->"+Thread.currentThread().getPriority());
MyPriority m =new MyPriority();
Thread t1 = new Thread(m);
Thread t2 = new Thread(m);
Thread t3 = new Thread(m);
Thread t4 = new Thread(m);
Thread t5 = new Thread(m);
Thread t6 = new Thread(m);
Thread t7 = new Thread(m);
//先设置优先级,再启动
t1.start();
t2.setPriority(1);
t2.start();
t3.setPriority(4);
t3.start();
t4.setPriority(Thread.MAX_PRIORITY);//=10
t4.start();
t5.setPriority(7);
t5.start();
t6.setPriority(9);
t6.start();
}
}
class MyPriority implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"->"+Thread.currentThread().getPriority());
}
}
package demo3;
//测试守护线程
//上帝守护你
public class TestDaemon {
public static void main(String[] args) {
// TODO Auto-generated method stub
God god = new God();
You you = new You();
Thread t = new Thread(god);
t.setDaemon(true);//默认false是用户线程,正常的线程都是用户线程
t.start();//上帝守护线程启动
new Thread(you).start();//你 用户线程启动
}
}
//上帝
class God implements Runnable{
@Override
public void run() {
while(true)
{
System.out.println("上帝保护着你");
}
}
}
//你
class You implements Runnable{
@Override
public void run() {
for(int i=0;i<36500;i++)
{
System.out.println("你一生都获得开心");
}
System.out.println("再见world");
}
}
并发:同一个对象被多个线程同时操作
线程同步:其实就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面线程使用完毕,下一个线程再使用。
package demo3;
//不安全的买票
public class UnsafeBuyTiket {
public static void main(String[] args) {
// TODO Auto-generated method stub
BuyTicket station = new BuyTicket();
new Thread(station,"苦逼的我").start();
new Thread(station,"牛逼的大家").start();
new Thread(station,"可恶的黄牛").start();
}
}
class BuyTicket implements Runnable{
//票
private int ticketNums = 10;
boolean flag = true;//外部停止方式
@Override
public void run() {
//买票
while(flag)
{
try{
buy();
}catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
private void buy() throws InterruptedException{
//判断是否有票
if(ticketNums<=0)
{
return;
}
//模拟延时
Thread.sleep(100);
//买票
System.out.println(Thread.currentThread().getName()+"拿到了"+ticketNums--+"票");
}
}
package demo3;
//不安全的取钱
//两个人去银行取钱,账户
public class UnsafeBank {
public static void main(String[] args) {
// TODO Auto-generated method stub
Account a = new Account(100,"结婚基金");
Drawing you = new Drawing(a,50,"你");
Drawing girl = new Drawing(a,100,"girl");
you.start();
girl.start();
}
}
//账户
class Account{
int money;//余额
String name;//卡名
public Account(int money,String name)
{
this.money = money;
this.name = name;
}
}
//银行:模拟取款
class Drawing extends Thread{
Account account;//账户
int drawingMoney;//取了多少钱
int nowMoney;//现在手里有多少钱
public Drawing(Account account,int drawingMoney,String name) {
super(name);
this.account = account;
this.drawingMoney = drawingMoney;
}
//取钱
@Override
public void run() {
//判断有没有钱
if(account.money-drawingMoney<0)
{
System.out.println(Thread.currentThread().getName()+"钱不够");
return;
}
//sleep可以放大问题的发生性
try {
Thread.sleep(1000);
}catch(Exception e)
{
e.printStackTrace();
}
//卡内余额=余额-你取的钱
account.money = account.money-drawingMoney;
//你手里的钱
nowMoney = nowMoney + drawingMoney;
System.out.println(account.name+"余额为"+account.money);
//这两个操作等价
//System.out.println(this.getName()+Thread.currentThread().getName());
System.out.println(this.getName()+"手里的钱"+nowMoney);
}
}
package demo3;
import java.util.ArrayList;
import java.util.List;
//线程不安全的集合
public class UnsafeList {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> list = new ArrayList<String>();
for(int i=0;i<10000;i++)
{
new Thread(()->{
list.add(Thread.currentThread().getName());
}).start();
}
try {
Thread.sleep(3000);
}catch(Exception e)
{
e.printStackTrace();
}
System.out.println(list.size());
}
}
运行结果(不足10000,因为存在两个线程同时看到一个标志,于是name就被覆盖掉了):
package demo3;
//不安全的买票
public class UnsafeBuyTiket {
public static void main(String[] args) {
// TODO Auto-generated method stub
BuyTicket station = new BuyTicket();
new Thread(station,"苦逼的我").start();
new Thread(station,"牛逼的大家").start();
new Thread(station,"可恶的黄牛").start();
}
}
class BuyTicket implements Runnable{
//票
private int ticketNums = 10;
boolean flag = true;//外部停止方式
@Override
public void run() {
//买票
while(flag)
{
try{
buy();
}catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
//同步方法,锁的是this
private synchronized void buy() throws InterruptedException{
//判断是否有票
if(ticketNums<=0)
{
return;
}
//模拟延时
Thread.sleep(100);
//买票
System.out.println(Thread.currentThread().getName()+"拿到了"+ticketNums--+"票");
}
}
package demo3;
//不安全的取钱
//两个人去银行取钱,账户
public class UnsafeBank {
public static void main(String[] args) {
// TODO Auto-generated method stub
Account a = new Account(100,"结婚基金");
Drawing you = new Drawing(a,50,"你");
Drawing girl = new Drawing(a,100,"girl");
you.start();
girl.start();
}
}
//账户
class Account{
int money;//余额
String name;//卡名
public Account(int money,String name)
{
this.money = money;
this.name = name;
}
}
//银行:模拟取款
class Drawing extends Thread{
Account account;//账户
int drawingMoney;//取了多少钱
int nowMoney;//现在手里有多少钱
public Drawing(Account account,int drawingMoney,String name) {
super(name);
this.account = account;
this.drawingMoney = drawingMoney;
}
//取钱
@Override
public void run() {
synchronized(account)
{
//判断有没有钱
if(account.money-drawingMoney<0)
{
System.out.println(Thread.currentThread().getName()+"钱不够");
return;
}
//sleep可以放大问题的发生性
try {
Thread.sleep(1000);
}catch(Exception e)
{
e.printStackTrace();
}
//卡内余额=余额-你取的钱
account.money = account.money-drawingMoney;
//你手里的钱
nowMoney = nowMoney + drawingMoney;
System.out.println(account.name+"余额为"+account.money);
//这两个操作等价
//System.out.println(this.getName()+Thread.currentThread().getName());
System.out.println(this.getName()+"手里的钱"+nowMoney);
}
}
}
package demo3;
import java.util.ArrayList;
import java.util.List;
//线程不安全的集合
public class UnsafeList {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> list = new ArrayList<String>();
for(int i=0;i<10000;i++)
{
new Thread(()->{
synchronized(list)
{
list.add(Thread.currentThread().getName());
}
}).start();
}
try {
Thread.sleep(3000);
}catch(Exception e)
{
e.printStackTrace();
}
System.out.println(list.size());
}
}