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
- 【Java多线程】多线程死锁
- Java 多线程
- java 多线程
- java多线程
- JAVA多线程
- java多线程
- JAVA多线程
- java多线程
- JAVA 多线程
- Java多线程
- java多线程
- JAVA 多线程
- Java 多线程
- Java 多线程
- java多线程
- Java 多线程
- Java多线程
- java 多线程
- CentOS升级Python2.6到Python2.7并安装pip
- maven:使用mvn archetype:generate创建项目,停留在 "Generating project in Batch mode"
- 图像检索公开数据集
- 【LeetCode】406. Queue Reconstruction by Height
- oracle 权限管理、角色管理详解
- java多线程
- android 代码规范总结
- python断言
- JAVA中的强引用、软引用、弱引用、虚引用
- Maven 插件
- 第二章:类和对象的特征
- Android环境搭建之eclipse
- 最长递增子序列问题
- latex使用技巧