提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
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();
}
}
}