多线程的简单实现(一):
一、说明:本身线程就是一门大的课程,在此只做基本的java中的基本认识。
概念:
a.程序:是一个静态的概念,一般对应于操作系统中的一个可执行文件,比如:我们要启网易云听音乐,则对应网易云的可执行程序。当我们双击网易云,则加载程序到内存中,开始执行该程序,于是产生了“进程”。
(完成特定任务,用某种语言编写的一组指令的集合。)
b.进程:现代的操作系统都可以同时启动多个进程。比如:我们在用网易云听音乐,也可以使用IDEA写代码,也可以同时用浏览器查看网页。
(正在运行中的一个程序,有自身的产生,存在和消亡)。
c.线程: 一个进程可以产生多个线程。同多个进程可以共享操作系统的某些资源一样,同一进程的多个线程也可以共享此进程的某些资源(比如:代码、数据),所以线程又被称为轻量级进程(lightweight process)。
(进程进一步,程序内部执行路径,多个线程共享内存和地址空间。)
1. 一个进程内部的一个执行单元,它是程序中的一个单一的顺序控制流程。
2. 一个进程可拥有多个并行的(concurrent)线程。
3. 一个进程中的多个线程共享相同的内存单元/内存地址空间,可以访问相同的变量和对象,而且它们从同一堆中分配对象并进行通信、数据交换和同步操作。
4. 由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简便而且信息传递的速度也更快。
5. 线程的启动、中断、消亡,消耗的资源非常少。
并行:当两个或者多个事件在同一时刻发生。
并发:是指两个或多个事件在同一时间间隔发生。
二.实现多线程:
1.继承Thread类实现
public class TestThread extends Thread {//自定义类继承Thread类
}
2.重写Thread类的run方法
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(this.getName() + ":" + i);//getName()方法是返回线程名称
}
}
3.创建Thread类的子类对象
TestThread thread1 = new TestThread();//创建线程对象
4.调用Start()方法。
thread1.start();//启动线程
实现多线程:
1.实现Runnable接口:
public class TestThread2 implements Runnable {//自定义类实现Runnable接口;
2.重写run()方法:
//run()方法里是线程体;
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
3.创建线程对象,把实现了Runnable接口的对象作为参数传入
Thread thread1 = new Thread(new TestThread2());
4.启动线程
thread1.start();
实例:
public class TestThread2 implements Runnable {//自定义类实现Runnable接口;
//run()方法里是线程体;
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
public static void main(String[] args) {
//创建线程对象,把实现了Runnable接口的对象作为参数传入;
Thread thread1 = new Thread(new TestThread2());
thread1.start();//启动线程;
Thread thread2 = new Thread(new TestThread2());
thread2.start();
}
}
方法:
void Start():启动
run():重写
getName():返回线程名称
voidSetName():设置线程名称
yield():释放cpu的执行权
join():阻塞
sleep():睡觉
interrupt():中断线程
实例:
package ticket;
public class Tickets {
static private int count = 10;
static private int num;
static class BuyerThread extends Thread {
private Tickets ticket;
public BuyerThread(Tickets ticket) {
this.ticket = ticket;
}
@Override
public void run() {
while (true) {
synchronized (TestSynchronized.class) {
if (count > 0) {
count--;
num++;
System.out.println( Thread.currentThread().getName() + "购票成功,已出售"+num+" 剩余" + count );
} else {
break;
}
try {
sleep( 1 );
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
==
package ticket;
public class TestSynchronized {
public static void main(String[] args) {
Tickets ticket = new Tickets();
Tickets.BuyerThread buyerThread = new Tickets.BuyerThread( ticket );
buyerThread.setName("张三");
Tickets.BuyerThread buyerThread1 = new Tickets.BuyerThread( ticket );
buyerThread1.setName( "李四" );
Tickets.BuyerThread buyerThread2 = new Tickets.BuyerThread( ticket );
buyerThread2.setName( "黄牛" );
buyerThread.start();
buyerThread1.start();
buyerThread2.start();
}
}
==
结果:
张三购票成功,已出售1 剩余9
张三购票成功,已出售2 剩余8
张三购票成功,已出售3 剩余7
张三购票成功,已出售4 剩余6
张三购票成功,已出售5 剩余5
张三购票成功,已出售6 剩余4
张三购票成功,已出售7 剩余3
张三购票成功,已出售8 剩余2
张三购票成功,已出售9 剩余1
张三购票成功,已出售10 剩余0