1,进程和线程
1,一个进程和另外一个进程的之间是隔离的。但是对cpu来说都是一样的。一边打游戏,一边看电影。
2,两个线程是共享着同一片资源,在同一个进程里面,例如在腾讯视频,同时打开两部电影。
3,他们的目的都是充分的利用cpu。
4,java虚拟机就是一个进程。
5,线程的实现两种方式 Runnable接口,继承Thread类。
6,在主函数psvm开启的线程,叫主线程。没有多线程的时候,就只有一个主线程。
start()只是进入执行状态,并不是立即执行,执行得看cpu心情。
public class PrintChar implements Runnable{ private char c; private Integer times; public PrintChar(char c, Integer times) { this.c = c; this.times = times; } public PrintChar() { } @Override public void run() { for(int i=0;i<times;i++){ System.out.println(c); } } }
public class Start { public static void main(String[] args) { Thread t1 = new Thread(new PrintChar('A',50)); Thread t2 = new Thread(new PrintChar('B',50)); t1.start(); t2.start(); } }
运行发现,打印A,B是交替,并不是A打印完了,再打印B
还有一种是方式是继承Thread类
public class PrintCharOther extends Thread { private char c; private Integer times; public PrintCharOther(char c, Integer times) { this.c = c; this.times = times; } public PrintCharOther() { } @Override public void run() { for(int i=0;i<times;i++){ System.out.println(c); } } }
PrintCharOther t1 = new PrintCharOther('a',100); PrintCharOther t2 = new PrintCharOther('b',100); t1.start(); t2.start();
那么这两种方式那种好呢,java里面是多实现,单继承,一个类只能继承一个父类,一个爹,但是可以实现多个接口。
实现Runnable接口是非常灵活的。
看源码发现:
Thread类也是实现Runnable接口的。
几种线程里面的方法
//yield() 执行这个代码的时候,让出线程,让出线程并不代表下一次不执行,可能下一次cpu还可能选中 //让出cpu的执行权 Thread.yield();
//sleep()方法是让线程睡一会儿,里面的millis是毫秒 if (i>=10){ Thread.sleep(3000); }
还有一个设置线程的interrupt()方法,这个方法相对于stop()方法来说,很文雅,
t1.interrupt();
只是改了他t1方法的的标志位,不会造成脏数据
interrupt要配合着使用,真正决定线程运行不运行还是要自己决定,这个下面的代码的意思,
当当前线程被打断了,我自己break一下,跳出去,终止不终止,由线程本身决定。
if (Thread.currentThread().isInterrupted()){ break; }
还有一个方法:
if (Thread.interrupted()){ System.out.println(Thread.currentThread().isInterrupted() ); }
intertupted()方法,这个是看看是不是interrupt我了,然后顺便清除interrupt状态。点源码进去看看
就是当当前被intertupt了,就是true,返回true,然后再设置为false,就是说顺便清除interrupt状态