Java笔记杨枝12.2

多线程

进程:观察任务管理器,发现正在运行的程序(桌面的应用程序,客户端程序..)就是一个进程。
进程来说:进程是系统分配资源调用的一个独立单位。
线程:线程是依赖于进程存在,一个线程相当于进程中的某个任务。
多线程的意义:
一个进程中开启了多个任务,每个一任务(线程),他们在互相抢占CPU的执行权,(提高程序的执行效率)
多线程在抢占CPU的执行权:特点:具有随机性!
是多线程程序,由于java虚拟机中自带一个垃圾回收器,来确保程序不会轻易的造成内存溢出!
至少开启两条子线程:
当前程序在执行代码的时候,会开启main:主线程
垃圾回收器会开启一个垃圾回收线程,来确保程序不会内存异常,将不用的变量或者没有更多引用的对象来回收掉。
多线程的实现方法
方法一:
1)自定一个类:MyThread 继承自Thread类
2)在MyThread类中重写Thread类中的run()
3)在主线程中,创建该类的实例对象,启动线程

package prac;

public class Prac01 {
public static void main(String[] args) {
    MyThread  my1=new MyThread();
    MyThread  my2=new MyThread();
    //无参构造设置线程名称
    my1.setName("a");
    my2.setName("b");

    my1.start();
    my2.start();
    //获取当前正在执行的线程的名称:main
    System.out.println(Thread.currentThread().getName());
}
}
package prac;

public class MyThread extends Thread {

     public MyThread(){

                  }

    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(getName() + ":" + i);
        }
    }
}

一些方法:
1)public final void join()
throws InterruptedException等待该线程终止。
当前线程执行完才能执行其他线程。
(设置线程等待该线程终止该方法必须要启动线程)
2) public final int getPriority()返回线程的优先级。
默认优先级:5
public static final int MAX_PRIORITY 10 :最大优先级(优先级大的抢占到CPU的执行权大,并不代表就一定能抢到,因为线程的执行具有随机性!)
public static final int MIN_PRIORITY 1 :最小优先级
public static final int NORM_PRIORITY 5 :默认优先级
3)public static void yield()暂停当前正在执行的线程对象,并执行其他线程。
暂停当前线程执行其他线程,并不保证另一个线程就一定能抢占到CPU的执行权。
4)public final void setDaemon(boolean on) on指定true,就是设置守护线程…
jvm自动退出,对于主线程的数据如果直接输出完毕,对于两个守护线程来说不会立即消失,Jvm等会就自动退出.(启动线程前调用)

package prac;

public class Prac01 {
public static void main(String[] args) {
    MyThread  my1=new MyThread();
    MyThread  my2=new MyThread();
    //无参构造设置线程名称
    my1.setName("a");
    my2.setName("b");
  //设置守护线程
    my1.setDaemon(true);
    my2.setDaemon(true);

    my1.start();
    my2.start();
    //主线程
    Thread.currentThread().setName("AB");
    //获取当前正在执行的线程的名称:main
    for(int x=0;x<6;x++){
    System.out.println(Thread.currentThread().getName());
}
}
}

5)线程睡眠:
public static void sleep(long millis)
throws InterruptedException在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
6) 线程停止:
public final void stop():强迫线程停止执行
public void interrupt()中断线程。 表示中断线程一种状态
方法二
实现Runnable接口

package prac;

public class Prac02 {
public static void main(String[] args) {
    MyRunnable my = new MyRunnable() ;

    //public Thread(Runnable target,String name)
    Thread th1=new Thread(my,"a");
    Thread th2=new Thread(my,"b");

    th1.start() ;
    th2.start() ;
}
}
package prac;

public class MyRunnable implements Runnable {

         @Override
        public void run() {
        for(int i=0;i<100;i++){
            //间接的使用Thread类的静态功能得到线程名称
            System.out.println(Thread.currentThread().getName()+":"+i);
        }

        }
}

线程安全
检验多线程安全问题的标准:
1)当前是否是一个多线程环境
2)多线程环境中是否有共享数据
3)是否有多条语句对共享数据进行操作
Java的同步机制:
使用同步代码块:synchronized(同步锁对象){
多条语句对共享数据的操作;
}

package prac;

public class Prac04 {
    public static void main(String[] args) {
        SellTickets  st=new SellTickets();

        Thread th1=new Thread(st,"窗口一");
        Thread th2=new Thread(st,"窗口二");
        Thread th3=new Thread(st,"窗口三");

        th1.start();
        th2.start();
        th3.start();
    }
}
package prac;

public class SellTickets implements Runnable {

    private int tickets = 100;
    private Object obj = new Object();

    public void run() {
        while (true) {
            //同步机制
            synchronized (obj) {
                if (tickets > 0) {

                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()
                            + "正在出售第" + tickets-- + "张票");
                }
            }
        }
    }
}
package prac;

public class SellTickets implements Runnable {

    private int tickets = 100;

    public void run() {
        while (true) {
            sellTickets();
    }
    }
    //同步方法
    private synchronized void sellTickets() {
        if (tickets > 0) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()
                    + "正在出售第" + tickets-- + "张票");
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: The original text of the dream recorded by Jiangchengzi on the night of January 20th, translated and appreciated, is as follows:"On the night of January 20th, I dreamed that I was a butterfly, fluttering around in a beautiful garden, happy and content. I was surrounded by a variety of flowers, and the pleasant scent filled the air. The sun shone brightly, and the birds sang melodiously. I was truly in paradise." ### 回答2: 原文: 深宫月色残,银汉乱人言。 采樵归不见,相思在疏篱。 万里春风来,寸寸芳心碎。 翠华暗绿雨,尺素寒尘滑。 乙卯正月二十日夜,梦与博山先生相见。批书诀曰:“以直报怨,以德报德”。时平台飞路远,支雪采簪华乌。白池梧桐叶中素,青丘蓬莱问苍虚。辂晓雷鸣,玄云千里一江雨。骤兰香慢蕊俏,玉泉冰寒锦点珠。杨枝弄笛滋蔓草,秋水翻天风满庭。鸟兽尽经夜残雪,若开晴未报平生。明朝忽觉天游梦,冷艳云光空残红。 翻译: 深宫中,月色仍残,银河散乱人之言语。 采集早归,却见不到你,想念依然在深深篱笆间。 万里春风吹来,一寸一寸芳心碎裂。 翠色华丽的花朵暗淡,一寸寸素净的尘埃滑落。 乙卯正月二十日的夜晚,梦见了与博山先生相见。他给我留下了一段批书:“以直报怨,以德报德”。那时平台上的路途遥远,支雪采着华丽的乌鸦羽毛。池塘中白色梧桐的叶子素净,问清幽的青丘蓬莱仙穴处的苍虚。车轮在黎明时分响起雷声,玄云千里远,江河上下的雨水也如细丝般纷纷飘洒。茂盛的兰花香气慢慢散去,花蕊娇美,水泉冰寒上点缀着珍珠。杨枝弄笛,蔓草蔓延,秋水翻滚,天空充满风的香味。鸟兽经过夜晚的残雪,若是旷白晴朗,将不再记得以往的人生。清晨醒来,突然发觉身心在天空中遨游,寒冷美丽的云光仅余一点残红。 赏析: 这是唐代杜牧的《江城子·乙卯正月二十日夜记梦》。诗人通过描写梦境中的景象和情感表达了思念之情。诗中以深宫月夜为背景,描绘了月色残照、银河散乱的景象,与思念之情相呼应。诗人对于思念之人的期望和痛苦心情都交织在诗中,表达了内心的矛盾和苦楚。似乎诗人梦中遇见了博山先生,并从他那里得到了关于直报怨、德报德的短评,这为诗中的思念之情增添了一丝宽慰。通过描绘梦境中各种遥远而奇幻的景象,诗人巧妙地展现了自己内心的情感世界,使诗歌更具幽玄之美和意境深远之感。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值