自考在《操作系统中》学到了关于进程和线程的概念,结合Demo更好的理解了多线程原理,
这篇博客主要讲一下多线程的创建和我对这个创建过程的理解。
首先展现一张思维导图:
进程:是一个正在执行中的程序。
每一个进程执行都是一个执行顺序,该顺序是一个执行路径,或者叫控制单元。
线程:就是一个进程中的一个独立的控制单元。
线程在控制着进程的执行。
五种状态:
创建线程
方法一:(继承Thread类)
创建步骤:1.定义类继承Threard.
2.复写Thread类中的run方法,
3.调用线程的start方法,
该方法有两个作用:启动线程,调用run方法。
/*
这是一个车站买票小例子。
假设100张票,四个窗口(4个线程)
*/
class Ticket extends Thread{ //继承java中的Thread类,此类就是对线程这类事物的描述。
private static int ticket=100;
public void run(){ //实现run方法
while(true)
{
if (ticket>0)
{
System.out.println(Thread.currentThread().getName() +"....sale"+ticket--);
}
}
}
}
class TicketDemo {
public static void main(String[] args){
//建立四个线程
Ticket t1=new Ticket();
Ticket t2=new Ticket();
Ticket t3=new Ticket();
Ticket t4=new Ticket();
//通过start方法启动线程。
t1.start();
t2.start();
t3.start();
t4.start();
}
}运行结果:(看着应该是没有问题的...)
方法二:(实现Runnable接口)
创建步骤:
1.定义类实现Runnable接口
2.覆盖Runnable接口中的run方法
3.通过Thread类建立线程对象
4.将Runnable接口的子类对象作为实现参数传递给Thread类的构造函数。
5.调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。
/*
这是一个车站买票小例子。
假设100张票,四个窗口(4个线程)
*/
class Ticket implements Runnable{
private int tick=100;
public void run(){
while(true)
{
if(tick>0)
{
System.out.println(Thread.currentThread().getName()+"...sall...."+tick--);
}
}
}
}
class TicketDemo2{
public static void main(String [] args){
//下面的代码,你看懂了吗?这是我要讲的了。。。。
Ticket t=new Ticket();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
Thread t3=new Thread(t);
Thread t4=new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}运行结果假设和上面相同,省略..
解释上面代码:
通过对api的查找,java以提供了Thread类专门来描述线程。
这个类有几个值得注意的地方:
1.构造函数
2方法
总结:
就是说:先要创建线程--->调用start方法来开始线程-->java虚拟机调用run方法
而run方法中就是线程要执行的程序。
由于,在java中单继承的局限性,java设计师就设计了一个Runnable接口,而且里面只有一个方法名,
就是来实现run方法,创建进程。从而有了方法二。
我的理解,可以自己写一个Demo来模仿这样的过程。
/*
我们将方法一,和方法二结合起来,做一下实验
*/
class Thread{
private interface t;
public Thread( Runnable t)
{
this.t=t;
}
public void run()
{
t.run();
}
public void start() //*必须通过start方法才能创建线程。
{
this.run();
}
}
interface Runnable
{
public void run();
}
/*方法一
继承Thread类
复写run方法
创建线程类(创建Thread的子类对象),并调用start方法开启线程。
*/
/*方法二
实现Runnable中的run方法
创建线程类(创建Thread的对象),同时将线程中的运行代码加入到Thread构造方法中
调用start方法开启线程。
*/
通过对api的