java基础第七课(进程与线程)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


1.进程和线程的区别

2.概念

多线程:一个程序运行起来有多条执行路径,他就是多线程的。

一个进程至少有一条线程。

每个进程都有主线程,如果是多线程的话,除了主线程之外的线程,我们叫做工作线程。

主线程的生命周期一定是最长的。

多线程的用途:
(1)可以同时执行多个不同的任务
(2)一个任务特别大,我们可以将一个大任务分割成若干个小任务。

多线程的一些概念
优先级 这里可以看飞少fly的讲解

饥饿:通俗易懂的意思就是该线程一直处于等待状态,最终饿死。

Java里面最基础的两种创建方式

  • 继承Thread类
  • 实现Runnable接口

如何正确的结束线程
在系统里面提供的停止线程的方法都过程了。

通过执行结束条件来进行线程结束。

找条件,return,break,将执行权交给调用方。

(1)从内部找到执行结束的条件
(2)从外部给他一个结束执行的条件

3.代码

1.多线程

package com.xinyisu.study;

public class T01 {

	public static void main(String[] args) {
		//主线程
		//两个线程主观上是并行进行的,微观上交互进行的
		MyThread t = new MyThread(); // 创建线程对象
		t.start(); // 启动线程
		
		for (int i = 0; i < 10; i++) {
			System.out.println("MainThread...." + i);
			//sleep并未交出权限
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		//自定义一个执行入口类
		//new一个,创建线程
		Thread t2 = new Thread(new MyRunnable());
		t2.start();
	}
}

class MyThread extends Thread//线程类
{
	@Override
	//工作线程
	public void run() {  // run这个线程执行路径的入口
		for (int i = 0; i < 10; i++) {
			System.out.println("MyThread...." + i);
			
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}


//利用接口
//runnable接口的实现类
class MyRunnable implements Runnable
{
	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println("MyRunnable...." + i);
			
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}




2.、

package com.xinyisu.study;

public class T02 {

	public static void main(String[] args) {
		new MyThread1().start();
	}

}

class MyThread1 extends Thread
{
	@Override
	public void run() {  // run这个线程执行路径的入口
		int i = 0 ;
		while( true  )
		{
			i++;
			System.out.println("工作线程:" + i);

			//条件允许,结束循环
			if( i == 1000 )
			{
				return;
			}
		}
	}
}
package com.xinyisu.study;

public class T03 {

	public static void main(String[] args) throws InterruptedException {
		MyThread2 t = new MyThread2();
		t.start();
		
		Thread.sleep(1000);
		
		t.mystop();
	}

}

class MyThread2 extends Thread
{
	private boolean isStop = true;
	
	public void mystop()
	{
		isStop = false;
	}
	
	@Override
	public void run() {  // run这个线程执行路径的入口
		int i = 0 ;
		while( isStop  )
		{
			i++;
			System.out.println("工作线程:" + i);
		}
	}
}

4.8. 死锁
共享资源
资源争用

我们修正程序,比如:降低锁的粒度。

package com.xinyisu.study;

public class T05 {

	public static void main(String[] args) {
		MyThread4 t1 = new MyThread4("T1");
		t1.start();
		
		MyThread4 t2 = new MyThread4("T2");
		t2.start();
	}
}

class MyThread4 extends Thread
{
	private static Object objA = new Object();
	private static Object objB = new Object();
	
	private String name = "T1";
	public MyThread4(String name)
	{
		this.name = name;
	}
	
	@Override
	public void run() {
		
		if( this.name.equals("T1") )
		{
			synchronized (objA) {
				
				try {
					System.out.println("T1....A");
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
				synchronized (objB) {
					System.out.println("T1....B");
					try {
						Thread.sleep(2000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				
			}
		}else
		{
			synchronized (objB) {
				
				try {
					System.out.println("T2....B");
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
				synchronized (objA) {
					try {
						System.out.println("T2....A");
						Thread.sleep(1500);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				
			}
		}
	}
}



5.题目:
请选择是否听歌?Y:N,歌曲播放后,输入S停止播歌。
当输入了Y以后,开始播放歌曲。

package com.xinyisu.work;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Scanner;

public class T011 {

	public static void main(String[] args) throws InterruptedException {
		MyThread t = new MyThread();
		Scanner in = new Scanner(System.in);
		System.out.println("Y播放音乐,N不播放音乐,S停止播放");
		System.out.println("请输入Y/N");
		String str = in.next();
		if(str.equals("Y")) {
			t.start();
			}

		Scanner sc = new Scanner(System.in);
		String str1 = sc.next();
		if(str1.equals("S")) {
			System.out.println("停止播放!");
            System.exit(0);
		}
	}

}

class MyThread extends Thread {
	private boolean isStop = true;

	public void mystop(String str)
	{
		isStop = false;
	}

	public void run() {  // run这个线程执行路径的入口
		while( isStop  ) {
			Reader r = null;
			try {
				r = new FileReader("D://assignment//3.txt");
			} catch (FileNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			BufferedReader br = new BufferedReader(r);
			String t = null;
			try {
				while ((t = br.readLine()) != null) {
					System.out.println(t);
					try {
				        Thread.sleep(2000);
				    } catch (InterruptedException e) {
				        e.printStackTrace();
				    }
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	
		}
	}
}

6.四个售票窗口卖火车票,一共1000张票
购买的是编号 xxx 的票
正在出票
票号为xxx的票,出票完毕

package com.xinyisu.work;

public class T02 {
    public static void main(String[] args) {
        Ticket ticket = new Ticket(500);
        TicketSale ts1 = new TicketSale(1, ticket);
        TicketSale ts2 = new TicketSale(1, ticket);
        TicketSale ts3 = new TicketSale(1, ticket);
        ts1.start();
        ts2.start();
        ts3.start();
    }
}

class Ticket {
    private int ticketNum;
    public Ticket(int ticketNum) {
        this.ticketNum = ticketNum;
    }
 
    public int getTicketNum() {
        return ticketNum;
    }
 
    public void setTicketNum(int ticketNum) {
        this.ticketNum = ticketNum;
    }
}
 
class TicketSale extends Thread {
    private int saleNum;
    private Ticket ticket;
 
 
    public TicketSale(int saleNum, Ticket ticket) {
        this.saleNum = saleNum;
        this.ticket = ticket;
    }
    @Override
    public void run() {
        try {
            while (true) {
                    synchronized (ticket) {
                        if (ticket.getTicketNum() <= 0) {
                            break;
                        }
                        ticket.setTicketNum(ticket.getTicketNum() - this.saleNum);
                        System.out.println("Now is Thread " + TicketSale.currentThread().getName());
                        System.out.println(ticket.getTicketNum() + "tickets to sale");
                    }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值