Java–多线程–线程状态、线程优先级、守护线程、线程不安全三案例以及synchronized关键字
线程状态
package com.zy.thread;
public class StudyThreadState {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(()->{
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("......................");
});
Thread.State state = thread.getState();
System.out.println(state);
thread.start();
state = thread.getState();
System.out.println(state);
while (state != Thread.State.TERMINATED){
Thread.sleep(100);
state = thread.getState();
System.out.println(state);
}
}
}
线程优先级
package com.zy.thread;
public class StudyThreadPriority {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName()+"--->"+Thread.currentThread().getPriority());
MyPriority myPriority = new MyPriority();
Thread t1 = new Thread(myPriority);
Thread t2 = new Thread(myPriority);
Thread t3 = new Thread(myPriority);
Thread t4 = new Thread(myPriority);
Thread t5 = new Thread(myPriority);
Thread t6 = new Thread(myPriority);
t2.setPriority(Thread.MIN_PRIORITY);
t3.setPriority(4);
t4.setPriority(Thread.MAX_PRIORITY);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class MyPriority implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"--->"+Thread.currentThread().getPriority());
}
}
守护线程
package com.zy.thread;
public class StudyThreadDaemon {
public static void main(String[] args) {
God god = new God();
Person person = new Person();
Thread thread = new Thread(god);
thread.setDaemon(true);
thread.start();
new Thread(person).start();
}
}
class God implements Runnable{
@Override
public void run() {
while (true){
System.out.println("上帝保佑着你");
}
}
}
class Person implements Runnable{
@Override
public void run() {
for (int i = 0; i < 36500; i++) {
System.out.println("你这一生都开心的活着");
}
System.out.println("==========再见,世界!!!===========");
}
}
线程不安全案例
package com.zy.thread.sync;
public class UnsafeBuyTicket {
public static void main(String[] args) {
BuyTicket buyTicket = new BuyTicket();
new Thread(buyTicket,"小米").start();
new Thread(buyTicket,"小张").start();
new Thread(buyTicket,"小王").start();
}
}
class BuyTicket implements Runnable{
private int ticketNumbers = 10;
boolean flag = true;
@Override
public void run() {
while (flag){
try {
buy();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private synchronized void buy() throws InterruptedException {
if(ticketNumbers <=0){
flag = false;
return;
}
Thread.sleep(100);
System.out.println(Thread.currentThread().getName()+"拿到了第"+ticketNumbers--+"张票");
}
}
package com.zy.thread.sync;
public class UnsafeBank {
public static void main(String[] args) {
Account account = new Account(1000,"买房的钱");
Drawing boy = new Drawing(account,50,"你");
Drawing girl = new Drawing(account,100,"女朋友");
boy.start();
girl.start();
}
}
class Account{
private int money;
private String name;
public Account(int money, String name) {
this.money = money;
this.name = name;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Drawing extends Thread{
private Account account;
private int drawingMoney;
private 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.getMoney() - drawingMoney < 0){
System.out.println(this.getName()+"余额不足,无法提取");
return;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
account.setMoney(account.getMoney()-drawingMoney);
nowMoney = nowMoney + drawingMoney;
System.out.println(account.getName()+"余额为:"+account.getMoney());
System.out.println(this.getName()+"手里的钱为:"+nowMoney);
}
}
}
package com.zy.thread.sync;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class UnsafeList {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
new Thread(()->{
synchronized (list){
list.add(Thread.currentThread().getName());
System.out.println("List大小:"+list.size()+"===>"+Thread.currentThread().getName());
}
}).start();
}
}
}