Java多线程的学习

一、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(运行):这时的线程指的是获得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{

	@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();
	}

}
介绍完毕,谢谢!


猜你喜欢

转载自blog.csdn.net/qq_35070001/article/details/78022232