Java笔记第八弹

设置和获取线程名称
//方法
void setName(String name);//将此线程的名称更改为等于参数name
String getName();//返回此线程的名称
public static Thread currentThread();//返回对当前正在执行的线程对象的引用
相关应用:
//无参构造方法
 import java.io.*;

public class Main{
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        DateTest d1=new DateTest();

        DateTest d2=new DateTest();

        d1.start();
        d2.start();

    }
}

//DateTest.java
public class DateTest extends Thread{

    public void run(){
        for(int i=0;i<100;i++){
            System.out.println(getName()+":"+i);
        }
    }
}
//含参构造方法
 import java.io.*;

public class Main{
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //方法一
        DateTest d1=new DateTest();

        DateTest d2=new DateTest();

        //设置名称
        d1.setName("高铁");
        d2.setName("飞机");
        
        //方法二
         DateTest d1=new DateTest("高铁");

        DateTest d2=new DateTest("飞机");

        d1.start();
        d2.start();

    }
}

//DateTest.java
public class DateTest extends Thread{
//方法二
    public DateTest(){}
    public DateTest(String name){
        super(name);
    }
    
    
    public void run(){
        for(int i=0;i<100;i++){
            System.out.println(getName()+":"+i);
            System.out.println(DateTest.currentThread().getName())
        }
    }
}

线程调度

1、分时调度模型

2、抢占式调度模型(java)

线程优先级
//Thread类中设置和获取线程优先级的方法
public final int getPriority();//返回此线程的优先级
public final void setPriority();//更改此线程的优先级
相关应用:
 import java.io.*;

public class Main{
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        DateTest d1=new DateTest();

        DateTest d2=new DateTest();
        
        d1.setName("高铁");
        d2.setName("飞机");
        d3.setName("汽车");
        
        //返回其优先级
        System.out.println(d1.getPriority());//=5
        System.out.println(d2.getPriority());//=5
        System.out.println(d3.getPriority());//=5
        
        System.out.println(Thread.MAX_PRIORITY);//=10
        System.out.println(Thread.MIN_PRIORITY);//=1
        System.out.println(Thread.NORM_PRIORITY);//=5
        
        //设置线程的优先级
        d1.setPriority(5);
        d2.serPriority(10);//仅代表获取CPU的几率高
        d3.setPriority(1);

        d1.start();
        d2.start();

    }
}

//DateTest.java
public class DateTest extends Thread{

    public void run(){
        for(int i=0;i<100;i++){
            System.out.println(getName()+":"+i);
        }
    }
}
线程控制
static void sleep(long millis);//使当前正在执行的线程停留(暂停执行)指定的毫秒数
void join();//等待这个线程死亡
void setDaemon(boolean on);//将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出
相关应用:
//ThreadSleep.java
public void run(){
    for(int i=0;i<100;i++){
        System.out.println(getName()+":"+i);
        try{
        Thread.sleep(1000);
        }catch(InterruptedException e){
            e.printStackTrace();
        }
    }
}

//ThreadSleepDemo.java
ThreadSleep t1=new ThreadSleep();
ThreadSleep t2=new ThreadSleep();
ThreadSleep t3=new ThreadSleep();

//使得一次接一次得出现
t1.setName("曹操");
t2.setName("刘备");
t3.setName("孙权");

t1.start();
t2.start();
t3.start();

//ThreadJoin.java
public void run(){
    for(int i=0;i<100;i++){
        System.out.println(getName()+":"+i);
    }
}
//ThreadJoinDemo.java
ThreadJoin t1=new ThreadJoin();
ThreadJoin t2=new ThreadJoin();
ThreadJoin t3=new ThreadJoin();

t1.setName("康熙");
t2.setName("四阿哥");
t3.setName("八阿哥");

t1.start();
try{
    t1.join();//等待这个线程死亡
}catch(InterruptedException e){
    e.printStackTrace();
}
t2.start();
t3.start();
//ThreadDaemon.java
public void run(){
    for(int i=0;i<100;i++){
        System.out.println(getName()+":"+i); 
    }
}
//ThreadDaemonDemo.java---守护线程
ThreadDaemon d1=new ThreadDaemon();
ThreadDaemon d2=new ThreadDaemon();

d1.setName("关羽");
d2.setName("张飞");

//设置主线程为刘备
Thread.currentThread().setName("刘备");

//设置守护线程
d1.setDaemon(true);
d2.setDaemon(true);

d1.start();
d2.start();

for(int i=0;i<10;i++){
    System.out.println(Thread.currentThread.getName()+":"+i);
}
线程生命周期
//     新建->就绪->运行->死亡
多线程的实现方式
方式2:实现Runnable接口

避免了Java单继承的局限性

适合多个相同代码去处理同一个资源的情况,把线程和程序的代码、数据有效分离,较好地体现了面向对象的设计思想

//MyRunnableDemo.java
MyRunnable my=new MyRunnable();

Thread t1=new Thread(my,"高铁");
Thread t2=new Threda(my,"飞机");

//启动线程
t1.start();
t2.start();


//MyRunnable.java,接口是Runnable
public void run(){
    for(int i=0;i<100;i++){
        System.out.println(Thread.currentThread().getName()+":"+i);
    }
}
线程同步
案例:卖票
//sellTicket.java
public void run(){
    while(true){//死循环
    if(tickets>0){//实现卖票
        System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"张票");
        tickets--;
    }
    }
}
//sellTicketDemo.java
sellTicket t1=new sellTicket();

Thread d1=new Thread(t1,"窗口1");
Thread d2=new Thread(t2,"窗口2");
Thread d3=new Thread(t3,"窗口3");

d1.start();
d2.start();
d3.start();
posted @ 2022-07-29 20:56  yesyes1  阅读(16)  评论(0编辑  收藏  举报