一、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;
}
@Override
public 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;
}
@Override
public 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;
}
@Override
public 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{
@Override
public 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{
@Override
public void run() {
// TODO Auto-generated method stub
for(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 block
e.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")
@Override
public void run() {
// TODO Auto-generated method stub
for(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 block
e.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;
}
@Override
public 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;
}
@Override
public 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();
}
}
介绍完毕,谢谢!