JAVASE_day06进程和线程(1)

并行和并发:

JAVASE_day06进程和线程(1)_第1张图片

进程和线程:

JAVASE_day06进程和线程(1)_第2张图片


多线程的优势:


JAVA中创建进程的方式:

package com.anonymous.javase.day06;

import java.io.IOException;
import java.util.List;

	/*java操作进程:
	在java代码中如何运行一个进程().
	方式1:Runtime类中的exec方法;
	方式2:ProcessBuilder类中的start方法:
	 */
public class Demo1 {
	public static void main(String[] args) throws IOException {
		//方式1:启动Runtime的exec方法
		Runtime runtime = Runtime.getRuntime();
		runtime.exec("notepad");
		runtime.exec("calc");
		
		//方式2:ProcessBuilder的start
		ProcessBuilder builder = new ProcessBuilder("notepad");
		builder.start();
	}
}

java中创建线程的方式:

创建和启动线程,传统有两种方式: 方式1:继承Tread类; 方式2:实现Runnable接口; 线程类(java.lang.Tread):Tread类和Tread的子类才能称之为线程类, 主线程(main方法是主线程);

Thread继承方式:

package com.anonymous.javase.day06;

//继承和实现两种方式启动线程

//使用Thread方式
public class Demo2 extends Thread {
	/**
	 * 创建和启动线程,传统有两种方式: 方式1:继承Tread类; 方式2:实现Runnable接口;
	 * 线程类(java.lang.Tread):Tread类和Tread的子类才能称之为线程类, 主线程(main方法是主线程);
	 */

	@Override
	public void run() {
		for (int i = 1; i <= 50; i++) {
			System.out.println("打游戏!" + i);
		}
	}

	public static void main(String[] args) {
		for (int i = 1; i <= 50; i++) {
			System.out.println("敲代码!" + i);
			if (i == 10) {
				Demo2 demo2 = new Demo2();
				demo2.start();
			}
			/**
			 * 敲代码!1 敲代码!2 敲代码!3 敲代码!4 敲代码!5 敲代码!6 敲代码!7 敲代码!8 敲代码!9 敲代码!10
			 * 敲代码!11 敲代码!12 敲代码!13 敲代码!14 敲代码!15 敲代码!16 敲代码!17 敲代码!18 敲代码!19
			 * 敲代码!20 (<这里才开始让线程><>)打游戏!1 敲代码!21 打游戏!2 敲代码!22 打游戏!3 敲代码!23 打游戏!4 打游戏!5 敲代码!24
			 * 打游戏!6 打游戏!7 敲代码!25 打游戏!8 打游戏!9 敲代码!26 打游戏!10 敲代码!27 打游戏!11 敲代码!28
			 * 敲代码!29 打游戏!12 敲代码!30 打游戏!13 敲代码!31 打游戏!14 敲代码!32 打游戏!15 敲代码!33
			 * 打游戏!16 敲代码!34 打游戏!17 敲代码!35 敲代码!36 打游戏!18 敲代码!37 敲代码!38 打游戏!19
			 * 敲代码!39 打游戏!20 敲代码!40 打游戏!21 敲代码!41 打游戏!22 打游戏!23 打游戏!24 打游戏!25
			 * 打游戏!26 打游戏!27 打游戏!28 敲代码!42 打游戏!29 敲代码!43 打游戏!30 敲代码!44 打游戏!31
			 * 敲代码!45 打游戏!32 敲代码!46 打游戏!33 敲代码!47 打游戏!34 敲代码!48 打游戏!35 敲代码!49
			 * 打游戏!36 敲代码!50 打游戏!37 打游戏!38 打游戏!39 打游戏!40 打游戏!41 打游戏!42 打游戏!43
			 * 打游戏!44 打游戏!45 打游戏!46 打游戏!47 打游戏!48 打游戏!49 打游戏!50
			 */
		}
	}
}


Runnable实现方式:

package com.anonymous.javase.day06;

//使用Runnable
class Demo3 implements Runnable {

	@Override
	public void run() {
		for (int i = 1; i <= 50; i++) {
			System.out.println("运行中..." + i);
		}
	}

	public static void main(String[] args) {
		for (int i = 1; i <= 50; i++) {
			System.out.println("运行的方式..." + i);
			if (i == 20) {
				Runnable demo3 = new Demo3();
				Thread thread = new Thread(demo3);
				thread.start();
			}
			/**
			 * 运行的方式...1 运行的方式...2 运行的方式...3 运行的方式...4 运行的方式...5 运行的方式...6
			 * 运行的方式...7 运行的方式...8 运行的方式...9 运行的方式...10 运行的方式...11 运行的方式...12
			 * 运行的方式...13 运行的方式...14 运行的方式...15 运行的方式...16 运行的方式...17 运行的方式...18
			 * 运行的方式...19 运行的方式...20 运行的方式...21 运行的方式...22 运行的方式...23 运行的方式...24
			 * 运行的方式...25 <到25的时候才让出线程><>运行中...1 运行的方式...26 运行中...2 运行的方式...27 运行中...3
			 * 运行的方式...28 运行中...4 运行的方式...29 运行中...5 运行的方式...30 运行中...6
			 * 运行的方式...31 运行中...7 运行的方式...32 运行中...8 运行的方式...33 运行中...9
			 * 运行的方式...34 运行中...10 运行的方式...35 运行中...11 运行的方式...36 运行中...12
			 * 运行的方式...37 运行中...13 运行的方式...38 运行中...14 运行的方式...39 运行中...15
			 * 运行的方式...40 运行中...16 运行的方式...41 运行中...17 运行的方式...42 运行中...18
			 * 运行的方式...43 运行中...19 运行的方式...44 运行中...20 运行的方式...45 运行中...21
			 * 运行的方式...46 运行中...22 运行的方式...47 运行中...23 运行的方式...48 运行中...24
			 * 运行的方式...49 运行中...25 运行的方式...50 运行中...26 运行中...27 运行中...28
			 * 运行中...29 运行中...30 运行中...31 运行中...32 运行中...33 运行中...34 运行中...35
			 * 运行中...36 运行中...37 运行中...38 运行中...39 运行中...40 运行中...41 运行中...42
			 * 运行中...43 运行中...44 运行中...45 运行中...46 运行中...47 运行中...48 运行中...49
			 * 运行中...50
			 */
		}
	}
}

吃苹果案列:

package com.anonymous.javase.day06;

public class Demo5 implements Runnable {
	private int apple = 50;

	public static void main(String[] args) {
		Demo5 demo5 = new Demo5();
		new Thread(demo5, "小明").start();
		new Thread(demo5, "名").start();
		new Thread(demo5, "红").start();
	}

	@Override
	public void run() {

		for (int j = 50; j >= 0; j--) {
			if (apple > 0) {
				System.out.println(Thread.currentThread().getName() + "吃了"
						+ apple + "苹果");
				apple--;
			}
			/**
			 * 名吃了50苹果 红吃了50苹果 小明吃了50苹果 红吃了48苹果 名吃了49苹果 红吃了46苹果 红吃了44苹果 红吃了43苹果
			 * 小明吃了47苹果 小明吃了41苹果 小明吃了40苹果 小明吃了39苹果 小明吃了38苹果 小明吃了37苹果 小明吃了36苹果
			 * 小明吃了35苹果 小明吃了34苹果 小明吃了33苹果 小明吃了32苹果 小明吃了31苹果 小明吃了30苹果 小明吃了29苹果
			 * 小明吃了28苹果 红吃了42苹果 红吃了26苹果 名吃了45苹果 红吃了25苹果 小明吃了27苹果 红吃了23苹果 名吃了24苹果
			 * 红吃了21苹果 小明吃了22苹果 红吃了19苹果 名吃了20苹果 红吃了17苹果 小明吃了18苹果 红吃了15苹果 名吃了16苹果
			 * 红吃了13苹果 小明吃了14苹果 红吃了11苹果 名吃了12苹果 红吃了9苹果 小明吃了10苹果 小明吃了6苹果 小明吃了5苹果
			 * 小明吃了4苹果 小明吃了3苹果 红吃了7苹果 红吃了1苹果 名吃了8苹果 小明吃了2苹果
			 */
		}
	}
}


使用Thread.sleep(10).模拟网络延迟


package com.anonymous.javase.day06;

public class Demo5 implements Runnable {
	private int apple = 50;
	public static void main(String[] args) {
		Demo5 demo5 = new Demo5();
		new Thread(demo5,"小明").start();
		new Thread(demo5,"名").start();
		new Thread(demo5,"红").start();
	}

	@Override
	public void run() {
			
		for (int j = 50; j >=0; j--) {
			if (apple>0) {
				try{
					Thread.sleep(10);
				}catch(Exception e){
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName()+"吃了"+apple+"苹果");
				apple--;
		}
	}
	}
}

JAVASE_day06进程和线程(1)_第3张图片

出现了负数

解决方案:有三种方式:

JAVASE_day06进程和线程(1)_第4张图片

package com.anonymous.javase.day06;

public class Demo5 implements Runnable {
	private int apple = 50;
	public static void main(String[] args) {
		Demo5 demo5 = new Demo5();
		new Thread(demo5,"小明").start();
		new Thread(demo5,"名").start();
		new Thread(demo5,"红").start();
	}

	@Override
	public void run() {
			
		for (int j = 50; j >=0; j--) {
			synchronized (this) {//加上synchronized代码块
			if (apple>0) {
				try{
					Thread.sleep(10);
				}catch(Exception e){
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName()+"吃了"+apple+"苹果");
				apple--;
			}
		}
	}
	}
}

使用synchronized同步方法

package com.anonymous.javase.day06;

public class Demo5 implements Runnable {
	private int apple = 50;
	public static void main(String[] args) {
		Demo5 demo5 = new Demo5();
		new Thread(demo5,"小明").start();
		new Thread(demo5,"名").start();
		new Thread(demo5,"红").start();
	}

	@Override
	public void run() {
			
		for (int j = 50; j >=0; j--) {
			eat();
		}
	}
	//使用synchronized同步方法
	synchronized private  void eat(){
		if (apple>0) {
			try{
				Thread.sleep(10);
			}catch(Exception e){
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName()+"吃了"+apple+"苹果");
                apple--;}}}
                //Thread.currentThread().getName();获取当前线程的名称

使用同步锁机制:

package com.anonymous.javase.day06;

import java.util.concurrent.locks.ReentrantLock;

public class Demo5 implements Runnable {
	 private final ReentrantLock lock = new ReentrantLock();
	private int apple = 50;
	public static void main(String[] args) {
		Demo5 demo5 = new Demo5();
		new Thread(demo5,"小明").start();
		new Thread(demo5,"名").start();
		new Thread(demo5,"红").start();
	}

	@Override
	public void run() {
			
		for (int j = 50; j >=0; j--) {
			eat();
		}
	}
	//同步锁:(Lock)
	//Lock机制提供了比synchronized代码块和synchronized方法更广泛的确定性操作,
	//同步代码块/同步方法具有的功能都有,除此之外更加强大,更体现面对对象

	private  void eat(){
		 lock.lock();//获取锁
		 if (apple>0) {
			try{
				Thread.sleep(10);
				System.out.println(Thread.currentThread().getName()+"吃了"+apple+"苹果");
				apple--;
			}catch(Exception e){
				e.printStackTrace();
			}finally{
				lock.unlock();//释放锁
			}
		}
	}
}

JAVASE_day06进程和线程(1)_第5张图片


package com.anonymous.javase.day06;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


//生产者
class ProducerTest implements Runnable {
	private ShareDemo6 share = new ShareDemo6();
	
	public ProducerTest(ShareDemo6 share){
		this.share = share;
	}

	@Override
	public void run() {
		for (int i = 1; i <= 50 ; i++) {
			if (i % 2 == 0) {
				share.setArgs("JACK", "男");
			}else{
				share.setArgs("ROSE", "女");
			}
		}
	}
	
	
}


//消费者
class CustomerTest implements Runnable{
	private ShareDemo6 share = new ShareDemo6();
	public CustomerTest(ShareDemo6 share){
		this.share = share;
	}
	
	@Override
	public void run(){
		for (int i = 1; i <= 50; i++) {
			share.pass();
		}
	}
	
}
public class ShareDemo6 {
	private String name ;
	private String gender ;
	private boolean stauts = true ;//表示生产者生产数据为空 
	private Lock lock =new ReentrantLock();
	Condition con = lock.newCondition(); 

	
	//生产者生产数据
	 public void setArgs(String name,String gender){
		 lock.lock();
		try {
			if(!stauts){//
				con.await();
			}
			Thread.sleep(10);
			this.name = name;
			this.gender = gender;
			stauts = false;
			con.signal();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally{
			lock.unlock();
		}
	}
	
	//消费者消费数据 
	 public void pass(){
		 lock.lock();
		try {
			if(stauts){
				con.await();
			}
			Thread.sleep(10);
			System.out.println(this.name+"_"+this.gender);
			stauts = true;
			con.signal();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally{
			lock.unlock();
		}
	}
	public static void main(String[] args) {
		ShareDemo6 share = new ShareDemo6();
		new Thread(new ProducerTest(share)).start();
		new Thread(new CustomerTest(share)).start();
	}
}


JAVASE_day06进程和线程(1)_第6张图片

线程的生命周期:

JAVASE_day06进程和线程(1)_第7张图片

JAVASE_day06进程和线程(1)_第8张图片

JAVASE_day06进程和线程(1)_第9张图片

JAVASE_day06进程和线程(1)_第10张图片

JAVASE_day06进程和线程(1)_第11张图片

线程睡眠:

package com.anonymous.javase.day06;
public class Demo7 {
	//线程睡眠
	public static void main(String[] args) {
		for (int i = 1; i <= 20; i++) {
			try {
				Thread.sleep(1000);//毫秒数
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(i);
		}
	}
}



package com.anonymous.javase.day06;

//联合线程
class JoinThread extends Thread{
	public JoinThread(String name){
		super(name);
	}
	@Override
	public void run() {
		for (int i = 1; i <= 50; i++) {
			System.out.println(super.getName()+"join"+i);
		}
	}
}
public class Demo8 {
	/**
	 * 联合线程:
	 * 线程的join方法,表示一个线程等待另一个线程完成后才执行,join方法被调用之后,线程对象处于阻塞状态
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException {
		JoinThread joinThread = new JoinThread("String");
		for (int i = 1; i <= 50; i++) {
			System.out.println("main线程"+i);
			if(i==5){
				joinThread.start();
			}
			if(i==20){//join()表示强制让出线程运行
				joinThread.join();
			}
		}
	}
}



package com.anonymous.javase.day06;

//后台线程

class DeamonTest extends Thread{
	@Override
	public void run() {
		for (int i = 1; i <= 500; i++) {
			System.out.println("杰克"+i);
		}
	}
}
public class Demo9 {
	public static void main(String[] args) {
		DeamonTest test = new DeamonTest();
		boolean daemon = test.isDaemon();
		System.out.println(daemon);
		for (int i = 1; i <= 50; i++) {
			System.out.println("main线程"+i);
			if (i==10) {
				test.setDaemon(true);
				test.start();
				System.out.println(test.isDaemon());
			}
		}
	}
}

你可能感兴趣的:(JavaSE入门)