1.内存中每个程序叫进程
- 一个程序中多个线程执行
- cpu中央处理器(英特尔,amd)intel core(核心)i5
- 浏览器下载一个线程,下载器多个线程下载同一个文件
- 分时调度:所有线程轮流使用;抢占式调度:根据优先级
2.thread
- 继承thread并重写run方法,使用start()(开启线程)虚拟机会自动调用run方法
- Thread.sleep(10);也有静态休眠方式
- main是一个栈,新的线程重新开一个栈,栈内存均是相对应线程私有
- 静态方法currentthread返回当前线程(Thread.currentThread().getName())
threadText tt=new threadText();
tt.setName("aaa");设置线程名
tt.sleep(1000);休眠,以毫秒为时间单位
tt.start();
----------
public class threadText extends Thread {
@Override
public void run() {
super.run();
System.out.println(this.getName());
}
}
3.Runnable 接口实现
- 耦合降低
SubRunable tt=new SubRunable();
new Thread(tt).start();
----------匿名内部类写法
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
-------
public class SubRunable implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"run111");
}
}
4.线程关系
- 生命周期:new,runable状态,死亡(stop)
- 在runable状态又有几种分别:
- 阻塞,正在等待执行,cpu调节,自动
- 休眠(sleep),可被唤醒执行或者阻塞,时间决定
- wait等待,可被唤醒(notify()),无限时
5.线程池
- 重复利用线程池中线程,因为创建线程和销毁占用大量资源
ExecutorService es = Executors.newFixedThreadPool(2);线程池放两个线程
es.submit(new SubRunable());
es.submit(new SubRunable());
es.submit(new SubRunable());
es.shutdown();销毁线程池,一般不用
SubRunable自定义线程对象有runable接口
两个现线程同时执行两个任务,第三个等待空闲线程
6.callable能抛异常,有返回值
- runable不能抛异常,没有返回值
ExecutorService es = Executors.newCachedThreadPool();
Future<String> s = es.submit(new TextCall());
System.out.println(s.get());
--------------------
public class TextCall implements Callable<String>{
@Override
public String call() throws Exception {
return "aaa";
}
}
自由定义返回值类型