一、进程概念:正在执行的程序
二、线程概念:线程是进程的控制单元,一个进程中可能会有多个线程
单线程:在同一时间段只能够执行一个任务
多线程:在同一时间段可以有多个任务同时执行
三、实现线程的两种方式
- 继承Thread 类
第一步:书写一个普通类,让此类继承Thread类
第二步:重写Thread类中的run方法,run方法中存放任务代码
package cn.java.thread;
/**
* Description: 任务一 <br/>
* Date: 上午8:51:19 <br/>
*
* @author zkl
* @version
* @see
*/
public class Task1 extends Thread {
@Override
public void run() {// 存放任务代码
for (int i = 1; i <= 1000; i++) {
System.out.println("Task1..............i=" + i);
}
}
}
package cn.java.thread;
/**
* Description: <br/>
* Date: 上午8:51:44 <br/>
*
* @author zkl
* @version
* @see
*/
public class Task2 extends Thread {
@Override
public void run() {
for (int j = 1; j <= 1000; j++) {
System.out.println("Task2..............j=" + j);
}
}
}
/**
* Project Name:dt55_chapter22
* File Name:Window.java
* Package Name:cn.java.thread
* Date:上午8:58:21
* Copyright (c) 2017, bluemobi All Rights Reserved.
*
*/
package cn.java.thread;
/**
* Description: <br/>
* Date: 上午8:58:21 <br/>
*
* @author dingP
* @version
* @see
*/
public class Window {
public static void main(String[] args) {
Task1 task1 = new Task1();// 任务一
Task2 task2 = new Task2();// 任务二
task1.start();
task2.start();
// task1.run();
// task2.run();
}
}
2. 实现Runnable接口
第一步:书写一个普通的任务类,让此类实现Runnable接口
第二步:实现Runnable接口中的run方法,存放任务
/**
* Project Name:dt55_chapter22
* File Name:Task1.java
* Package Name:cn.java.runnable
* Date:上午9:41:10
* Copyright (c) 2017, bluemobi All Rights Reserved.
*
*/
package cn.java.runnable;
/**
* Description: <br/>
* Date: 上午9:41:10 <br/>
*
* @author zkl
* @version
* @see
*/
public class Task1 implements Runnable {
@Override
public void run() {
try {
for (int i = 1; i <= 1000; i++) {
System.out.println("Task1..............i=" + i);
Thread.sleep(3000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package cn.java.runnable;
/**
* Description: <br/>
* Date: 上午9:41:10 <br/>
*
* @author zkl
* @version
* @see
*/
public class Task2 implements Runnable {
@Override
public void run() {
for (int j = 1; j <= 1000; j++) {
System.out.println("Task2..............j=" + j);
}
}
}
package cn.java.runnable;
/**
* Description: <br/>
* Date: 上午8:58:21 <br/>
*
* @author zkl
* @version
* @see
*/
public class Window {
public static void main(String[] args) {
Task1 task1 = new Task1();// 任务一
// Task2 task2 = new Task2();// 任务二
Thread th1 = new Thread(task1);
// Thread th2 = new Thread(task2);
th1.start();
// th2.start();
}
}
四、线程安全问题(*)
1.什么是线程安全问题?
当多个线程操作同一共享数据时,最终的结果不正常的问题
2.如何解决线程安全问题?
给完成某一任务的代码块上锁
package cn.java.synchronize;
/**
* Description: 模拟火车售票系统 <br/>
* Date: 上午10:19:02 <br/>
*
* @author zkl
* @version
* @see
*/
public class TicketSystem implements Runnable {
private static int ticket = 200;// 武汉--->北京:200张票
@Override
public void run() {// 卖票
try {
for (int i = 1; i <= 3000; i++) {
synchronized (TicketSystem.class) {
Thread.sleep(10);//
if (ticket > 0) {// 还有票
ticket = ticket - 1;
System.out.println("哈哈,我买到票了,还剩" + ticket + "张票");
} else {// ticket<=0
System.out.println("亲,票已经卖完了");
System.exit(0);
}
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package cn.java.synchronize;
/**
* Description: <br/>
* Date: 上午10:35:41 <br/>
*
* @author zkl
* @version
* @see
*/
public class TicketWindow {
public static void main(String[] args) {
TicketSystem ts = new TicketSystem();// 火车售票系统
Thread wuhan = new Thread(ts);// 武汉售票
Thread hunan = new Thread(ts);// 湖南售票
Thread changchun = new Thread(ts);// 长春售票
// 开始抢票
wuhan.start();
hunan.start();
changchun.start();
}
}