针对于自己先前所接触的知识,谈一谈自己对于Thread线程的理解;
很常见的一个小项目,Socket套接字编程,我们想要做一个即时聊天室,每个用户对应每个线程,我们在未使用线程的情况下,只能将两个单独用户参加聊天。
(网上资料也是太多,还是自己总结吧)
一篇很靠谱的线程博客
以上思路有问题,看完多线程直接写个socket试试;
(开始正文哈)
线程:Thread
教材上非得让我们区分进程(Process)和线程(Thread)的区别,简单的来说,就是线程包含于进程,是进程中更小的执行单位,在进程中允许多个线程运行。
线程的生命周期(同人类)
package com.Example.charpter08;
public class ThreadIntroduction {
public static void main(String[] args) {
// TODO Auto-generated method stub
new Demo_one().run();
new Demo_two().run();
new Demo_one().run();
new Demo_two().run();
new Demo_one().run();
new Demo_two().run();
}
}
class Demo_one extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("这个线程类是通过继承的方法获取");
}
}
class Demo_two implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("这个是通过Runnable接口实现");
}
}
今天最可恨的就是把接口的承接方式弄错了。
- 出生
Thread thread =new Thread();
向堆内存中申请空间存储数据。 - 就绪
thread.start();线程处于就绪状态,等待JVM分配内存空间。 - 运行
等待JVM分配内存空间,运行run方法;
//***********************************************//
在调用start()方法之前:线程处于新状态中,新状态指有一个Thread对象,但还没有一个真正的线程。
在调用start()方法之后:发生了一系列复杂的事情
启动新的执行线程(具有新的调用栈);
该线程从新状态转移到可运行状态;
当该线程获得机会执行时,其目标run()方法将运行。
注意:对Java来说,run()方法没有任何特别之处。像main()方法一样,它只是新线程知道调用的方法名称(和签名)。因此,在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程。
4. 阻塞
- 死亡
死亡比较清楚就是:一旦stop()或者run()执行完毕,就宣布线程死亡;