Java多线程的学习
来源:互联网 发布:mac怎么返回桌面 编辑:程序博客网 时间:2024/06/04 19:20
一、Java多线程的实现
1.继承Thread类
2.实现Runnable接口
3.多线程实现数据共享
示例代码1:
package com.java88.month09.date18;/** * 多线程继承Thread * @author user * */public class Demo6 extends Thread{private int abc = 1;private String threadName; public Demo6(String threadName){super();this.threadName = threadName;}@Overridepublic void run() {while(abc<=10){System.out.println(threadName+"吃了第"+abc+"个包子");abc++;}}public static void main(String[] args) {Demo6 thread1 = new Demo6("张三");Demo6 thread2 = new Demo6("李四");thread1.start();thread2.start();}}示例代码2:
package com.java88.month09.date18;/** * 多线程实现Runnable接口 * @author user * */public class Demo7 implements Runnable{private int abc = 1;private String threadName; public Demo7(String threadName){super();this.threadName = threadName;}@Overridepublic void run() {while(abc<=10){System.out.println(threadName+"吃了第"+abc+"个包子");abc++;}}public static void main(String[] args) {Demo7 thread1 = new Demo7("张三");Demo7 thread2 = new Demo7("李四");Thread t1 = new Thread(thread1);Thread t2 = new Thread(thread2);t1.start();t2.start();}}
示例代码3:
package com.java88.month09.date18;/** * 多线程实现数据共享 * @author user * */public class Demo8 implements Runnable{private int abc = 1;private String threadName; public Demo8(String threadName){super();this.threadName = threadName;}@Overridepublic synchronized void run() {while(abc<=10){System.out.println(threadName+"吃了第"+abc+"个包子");abc++;}}public static void main(String[] args) {Demo8 thread1 = new Demo8("超级张三");Thread t1 = new Thread(thread1);Thread t2 = new Thread(thread1);Thread t3 = new Thread(thread1);t1.start();t2.start();t3.start();}}
二、线程的状态
Java中的线程的生命周期大体可分为5种状态。
①NEW(新建):这种情况指的是,通过New关键字创建了Thread类(或其子类)的对象
②RUNNABLE(就绪):这种情况指的是Thread类的对象调用了start()方法,这时的线程就等待时间片轮转到自己这,以便获得CPU;第二种情况是线程在处于RUNNABLE状态时并没有运行完自己的run方法,时间片用完之后回到RUNNABLE状态;还有种情况就是处于BLOCKED状态的线程结束了当前的BLOCKED状态之后重新回到RUNNABLE状态。
③RUNNING(运行):这时的线程指的是获得CPU的RUNNABLE线程,RUNNING状态是所有线程都希望获得的状态。
④DEAD(终止):处于RUNNING状态的线程,在执行完run方法之后,就变成了DEAD状态了。
⑤BLOCKED(阻塞):这种状态指的是处于RUNNING状态的线程,出于某种原因,比如调用了sleep方法、等待用户输入等而让出当前的CPU给其他的线程。
三、线程的常用方法
1,getName(); 返回该线程的名称。
2,currentThread();返回对当前正在执行的线程对象的引用。
3,isAlive();测试线程是否处于活动状态。
4,sleep();线程休眠。
5,setPriority(int newPriority);更改线程的优先级。
6,yield();暂停当前正在执行的线程对象,并执行其他线程。
示例代码1(getName(),currentThread(),isAlive()):
package com.java88.month09.date18;/** * 线程的常用方法 * @author user * */public class Demo9 implements Runnable{@Overridepublic void run() {for(int i=0; i<10; i++){Thread t = Thread.currentThread();//获取当前线程System.out.println(t.getName() + ":" + i );}}public static void main(String[] args) {Demo9 t = new Demo9();//new Thread(t).start();//new Thread(t).start();//new Thread(t,"线程3").start();System.out.println("###############");Thread t1 = new Thread(t);System.out.println("t1是否活动:" + t1.isAlive());t1.start();System.out.println("t1是否活动:" + t1.isAlive());}}
示例代码2(setPriority(int newPriority),sleep()):
package com.java88.month09.date18;/** * 线程常用方法 * @author user * */public class Demo10 implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stubfor(int i=0; i<10; i++){try {Thread.sleep(1000);Thread t = Thread.currentThread();System.out.println(t.getName()+":"+i);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public static void main(String[] args) {Demo10 demo = new Demo10();//new Thread(demo).start();System.out.println("###############");Thread t1 = new Thread(demo,"线程A");Thread t2 = new Thread(demo,"线程B");Thread t3 = new Thread(demo,"线程C");t1.setPriority(Thread.MAX_PRIORITY);t2.setPriority(Thread.MIN_PRIORITY);t3.setPriority(Thread.NORM_PRIORITY);t1.start();t2.start();t3.start();}}
示例代码3(yield()):
package com.java88.month09.date18;public class Demo11 implements Runnable{@SuppressWarnings("static-access")@Overridepublic void run() {// TODO Auto-generated method stubfor(int i=0; i<10; i++){try {Thread.sleep(100);Thread t = Thread.currentThread();System.out.println(t.getName()+":"+i);if(i==5){System.out.println("线程礼让");t.yield();}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public static void main(String[] args) {Demo10 demo = new Demo10();new Thread(demo,"线程A").start();new Thread(demo,"线程B").start();}}
四、线程的同步
1.加同步锁:synchronized
2.加同步块: synchronized(this){}
示例代码1:
package com.java88.month09.date18;/** * 多线程实现数据共享 * @author user * */public class Demo8 implements Runnable{private int abc = 1;private String threadName; public Demo8(String threadName){super();this.threadName = threadName;}@Overridepublic synchronized void run() {while(abc<=10){System.out.println(threadName+"吃了第"+abc+"个包子");abc++;}}public static void main(String[] args) {Demo8 thread1 = new Demo8("超级张三");Thread t1 = new Thread(thread1);Thread t2 = new Thread(thread1);Thread t3 = new Thread(thread1);t1.start();t2.start();t3.start();}}
示例代码2:package com.java88.month09.date18;/** * 线程同步问题(如Demo8所示) * 1.加同步锁:synchronized * 2.加同步块: synchronized(this){} * @author user * */public class Demo12 implements Runnable{private int abc = 1;private String threadName; public Demo12(String threadName){super();this.threadName = threadName;}@Overridepublic void run() {synchronized(this){while(abc<=10){System.out.println(threadName+"吃了第"+abc+"个包子");abc++;}}}public static void main(String[] args) {Demo12 t = new Demo12("超级李");Thread t1 = new Thread(t);Thread t2 = new Thread(t);Thread t3 = new Thread(t);t1.start();t2.start();t3.start();}}
介绍完毕,谢谢!- Java多线程的学习
- java多线程的学习
- Java多线程的学习
- Java多线程的学习
- Java多线程的学习
- 【java多线程学习】多线程的基本概念
- 【java多线程学习】多线程的同步
- Java多线程和多线程计数器的学习
- java 学习-----多线程的安全问题
- 【Java多线程】的学习总结
- 学习JAVA多线程的网站
- [Thinking in JAVA] JAVA多线程的学习
- 【Java重新学习】Java多线程-多线程的创建
- Java多线程学习与Java多线程的简单应用
- java多线程学习一:实现多线程的两种方法
- java多线程学习笔记(一)!更好的理解多线程
- 多线程编程学习一(Java多线程的基础)
- 多线程编程学习一(Java多线程的基础)
- Spring的注入方式Setter和构造器
- Java虚拟机加载类
- 六个创建型模式4: 单例模式-Singleton Pattern【学习难度:★☆☆☆☆,使用频率:★★★★☆】
- Git教程,从基本原理理解掌握常用命令
- php文件引用头部有空白行()
- Java多线程的学习
- BP神经网络算法
- maven项目加载本地依赖jar文件
- 【转】如何自动生成和安装requirements.txt依赖
- php中引用&的真正理解-变量引用、函数引用、对象引用
- mysql去重之if的用法の数据去重
- 斐波那契数列(Fibonacci)
- 多面陈列的新突破
- 静态代码块 代码块 构造函数调用顺序