java多线程

来源:互联网 发布:科隆群岛 知乎 编辑:程序博客网 时间:2024/06/08 22:30

线程是程序执行的一条路径,一个进程中可以包含多个进程
多线程并发执行,可以提高程序的效率,可同时完成多个工作

多线程并行和并发
并行是甲乙同时运行,需要多核cpu
并发是看起来像是同时运行,实际是cpu分配时间片

jvm启动是多线程的,至少起动了垃圾回收线程和主线程,所以是多线程的

创建线程方法:

class MyThread extends Thread{    @Override    public void run() {    }}class MyRunnable implements Runnable{    public void run() {    }}start()方法开启线程

匿名内部类方法

  new Thread(){     @Override      public void run() {      }  }.start();  new Thread(new Runnable() {      public void run() {      }  }).start();

获取线程名称

public static void main(String[] args) {        new Thread(){            @Override            public void run() {                System.out.println(this.getName());            }        }.start();        new Thread(new Runnable() {            public void run() {                System.out.println(Thread.currentThread().getName());            }        }).start();        System.out.println(Thread.currentThread().getName());    }

休眠线程

Thread.sleep(毫秒)

守护线程
setDaemon(),设置一个线程为守护线程,该线程不会单独执行,其他非守护线程都执行结束后,自动退出

public static void main(String[] args) {        Thread t1 = new Thread(){            @Override            public void run() {                for (int i = 0; i <2 ; i++) {                    try {                        this.sleep(1);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    System.out.println("aa");                }            }        };        Thread t2 = new Thread(new Runnable() {            public void run() {                for (int i = 0; i < 100; i++) {                    try {                        Thread.currentThread().sleep(1);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    out.println("bb");                }            }        });        t2.setDaemon(true);        t1.start();        t2.start();    }aabbaabb

join

 public static void main(String[] args) {        final Thread t1 = new Thread(){            @Override            public void run() {                for (int i = 0; i <5 ; i++) {                    try {                        this.sleep(1);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    System.out.println("aa");                }            }        };        Thread t2 = new Thread(new Runnable() {            public void run() {                for (int i = 0; i < 5; i++) {                    try {                        Thread.currentThread().sleep(1);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    if(i == 2){                        try {                            t1.join();//i等于2时,让t1先执行完                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                    }                    System.out.println("bb");                }            }        });        t1.start();        t2.start();    }}aabbaabbaaaaaabbbbbb

yield
yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。

设置线程优先级
setPriority

public static final int MAX_PRIORITY 10 public static final int MIN_PRIORITY 1 public static final int NORM_PRIORITY 5 

同步代码块
多线程并发,有多段代码同时执行时,我们希望某一段代码执行的过程中cpu不要切换到其他线程工作,这时就需要同步
如果两段代码是同步的,那么同一时间只能执行一段,在一段代码执行没结束前,不会执行另一段代码

线程安全问题

public class Ticket {    public static void main(String[] args) {        new TicketThread().start();        new TicketThread().start();        new TicketThread().start();        new TicketThread().start();    }}class TicketThread extends Thread{    private static int cnt = 100;    @Override    public void run() {        while (true){            synchronized (TicketThread.class){                if(cnt == 0){                    break;                }                try {                    Thread.currentThread().sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }                System.out.println(this.getName()+"卖的第"+cnt--+"号票");            }        }    }}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 耳机皮掉了怎么办 债券逆回购买入怎么办 京东保价 发票怎么办 win7用户已锁定怎么办 电脑账户被锁定怎么办 win7状态不可用怎么办 电脑的本地连接不见了怎么办 win7电脑没有本地连接怎么办 win7字体换不了怎么办 电脑没系统了怎么办 电脑系统没有了怎么办 系统调用区域小怎么办 win8.1网络受限怎么办 电脑连wifi受限怎么办 鼠标不好用了怎么办 手机指纹不好使怎么办 手机录像不好使怎么办 手机1个卡不好使怎么办 手机收藏不好使怎么办 window10连不上网怎么办 电脑没有家庭组怎么办 usb共享网络出错怎么办 电脑共享有密码怎么办 win10连不上网怎么办 w10网络重置了怎么办 点击网络重置后怎么办? 电脑启动找不到硬盘怎么办 电脑开机找不到硬盘怎么办 电脑找不到宽带连接怎么办 电脑文件找不到了怎么办 电脑找不到手机热点怎么办 win7电脑没有网络适配器怎么办 手机计算机桌面找不到怎么办 手机忘记开锁密码怎么办 电脑没网感叹号怎么办 本地连接2没有了怎么办 电脑上找不到本地连接怎么办 网络无访问权限怎么办 电脑无网络访问怎么办 xp连不上网怎么办 xp系统本地连接不见了怎么办