进程: 每个进程都有独立的代码和数据空间( 进程上下文 );
线程:同一类线程共享代码和数据空间,每个线程都有独立的运行栈和陈旭计数器,(线程是cpu调度最小单位);
线程和进程一样一共分为六个阶段:
1. 新建装态( new Thread) 2. 运行状态( start()) 3.死亡状态( run()方法调用完毕);4.受阻塞(cpu未执行该线程)
5 . 休眠状态(sleep,休眠时间过了--恢复--可能运行,可能阻塞);6.等待状态(wait notify);
3 实现多线程的2种方法;
1. 创建一个类去继承Thread类,
//创建一个类实现Thread类:
class TestThread extends Thread{
//必须重写run()方法
@Overrride
public void fun(() {
System.out.println(Thread.currentThread().getName());
}
}
//在main 函数里面执行
TestThread t= new TestThread();
t.start();
fun();
2.创建一个类实现Runnable接口;
class Shi implements Runnable{
//重写接口中run(()方法;
public void run(){
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + "---" + i);
}
}
}
//在main函数里面;
Shi s1 = new Shi();
//创建一个线程类对象,将接口的实现类往对象里面穿, 有点像Treeset里面排序使用到比较器一样;
Thread thread = new Thread((s1);
//开始线程;
thread.start();
3 匿名内部类的创建:
//给一个类;
class Test{
public void fun() {
System.out.println("你好啊")
}
}
//创建一个接口:
Interface TestInter{
public abstractvoid fun(();
}
3.1 匿名内部类创建对象, new Test ( ){ }: 相当于Test子类的对象,这样就不用再继承以后后创建对象了
大括号里面中重写,父类中的方法;
Test test = new Test(){
//重写fun方法
@ Override
public void fun() {
sout(" 你真美")
}
}
3.2 匿名对象直接创建接口类的实现对象,必须重写接口中的抽象方法;
TestInter in = new TestInter(){
@Override
public void fun() {
sout( "我是接口中重写的方法");
}
}
4. 利用匿名内部类的方式:给集合中的三个学生对象按照年龄进行排序;
首先:student实现比较器( comparator ) ;重写compare方法.其次: 将实现类对象传入到集合中去;
//声明接口类的实现类对象;
Comparator <Student> comparator = new Comparator <Student>(){
//重写接口中的方法
@Override
public int compare (Student o1,Student o2){
int num = o1.getName()(- o2.getName();
return num;
}
};
//传入创建出来的实现类对象;这里传入的是实现比较器接口的实现类;
TreeSet<Student> t = new TreeSet<>(comparator);
t.add(new student( "王二",11));
t.add(new student( "王3",15));
t.add(new student( "王4",12));
sout(t);
5.线程的匿名创建;
方式1 Thread子类进行创建;
//用Thread子类进行创建
Thread th = new Thread(){
@Override //重写run()方法
public void run(){
};
//线程启动
th.start();
}
方式2( 接口实现类的方式 ) 这里与比较器( comparator )很相似,
Runnable runn= new runn(){
//重写接口中的抽象方法 run();
@override
public void run () {
}
};
创建一个Thread类将runnable实现类穿进去;
Thread thr = new Thread(runn);
thr.start();
方式3 ( 简写 )
// 方式3(方式)`
Thread thread4 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
thread4.start();