进程是程序的执行过程,它持有资源,共享内存,共享文件
和线程
线程使系统的最小的执行单元,同一进程中可以有多个线程;线程共享进程的资源
线程的交互,互斥和同步
线程的状态
新建状态 ->就绪状态 ->运行状态-> 阻塞状态 -> 死亡状态
常见线程的名词解释
主线程:jvm 调用程序mian()所产生的线程
当前线程:一般指通过Thread.currentThread()来获取的进程
后台线程:指为其他线程提供服务的线程,也称为守护线程,jvm 的守护线程就是一个后台额的线程
java语言对线程的支持
主要体现在Thread类和Runnable接口,都继承于java.lanng包。他们都有共同的方法
public void run()
run 方法为我们提供了线程实际的工作执行的代码
创建初体验
1,继承Thread类本身的
2,实现Runnable接口
public class Actor extends Thread{
public void run(){
System.out.println(getName()+"是一个演员");
int count = 0 ;
boolean keepRunning = true;
while(keepRunning){
System.out.println(getName()+"登台演出"+(++count));
if(count == 100){
keepRunning = false;
}
if(count%10 ==0){
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
}
java 线程的正确停止方法
stop方法,直接停止
第一种方法
继承Thread创建线程
java.lang.Thread 类创建线程是最简单的一种方法,也是最直接的。
package www.com.day20171012;
public class MyThread1 extends Thread {
public MyThread1(String name){
super(name);//传递线程的名字
}
public static void main(String[] args) {
for(int i =0;i<5;i++){
new MyThread1("thread"+ i).start();
}
}
@Override
public void run(){
for(int i =0;i<20;i++){
System.out.println(this.getName()+":"+i);
}
}
}
第二种 实现Runnable接口
package www.com.day20171012;
public class MyThreadTarget implements Runnable {
public static void main(String[] args) {
for (int i =0;i<5;i++){
Runnable r = new MyThreadTarget();
new Thread(r,"thread"+i).start();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i =0;i<20;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
1.2.3线程池
创建线程的过程中将占用一些CPU时间,结果将使用许多内存来支持大量线程
每个线程都运行得很慢。这样就无法很好的使用计算资源
package www.com.day20171012;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestThreadPool {
public static void main(String[] args) {
//在线程池中创建两个线程
ExecutorService exec = Executors.newFixedThreadPool(2);
//创建100个线程目标对象
for(int index =0;index < 100;index++){
Runnable run = new Runner(index);
//执行线程目标对象
exec.execute(run);
}
exec.shutdown();
}
}
class Runner implements Runnable{
int index = 0;
public Runner(int index){
this.index = index;
}
@Override
public void run() {
// TODO Auto-generated method stub
long time = (long) (Math.random()*1000);
System.out.println("线程:"+Thread.currentThread().getName()+"(目标对象"+index + ")"+":Sleeping"+time+"ms");
try {
Thread.sleep(time);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
使用sleep暂停执行
public static void main (String[] args){
String[] args = {"ne"}
long start = System.nanoTime();
for(int i =0;i<args.length;i++){
try{
System.out.println(args[i]);
//休眠主线程
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
long end = System.nanoTime();
System.out.println("总时间"+(end-start)/1000000);
}
使用join等待另外一个线程结束
join方法让一个线程等待另一个线程的完成,如果t1,t2是两个Thread对象
t2.join() 会导致 t1的暂时停止,t1会直到t2执行终止后在执行
stop 立即终止