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(运行):这时的线程指的是获得CPURUNNABLE线程,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();}}
介绍完毕,谢谢!


原创粉丝点击