启动线程的方式?
1. extends Thread
public class MyThread extends Thread {
@Override
public void run() {
for (int i=0;i<100;i++){
System.out.println ("aaaaaaaaaaaa");
}
}
}
public static void main(String[] arg){
MyThread myThread=new MyThread ();
myThread.start ();
for (int j=0;j<160;j++){
System.out.println ("bbbbbbbbb");
}
}
2.implements Runnable
public static void main(String args[]){
Runner1 r1 = new Runner1();
Thread t = new Thread(r1);
Runner1 r2 = new Runner1();
t.start();
for(int i=0;i<10;i++){
System.out.println("maintheod:"+i);
}
}
}
class Runner1 implements Runnable{
@Override
public void run(){
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread ().getName ()+" "+i);
}
}
}
3.Callable和Future
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
for (int i=0;i<100;i++){
System.out.println ("aaaaaaaaaaaa");
}
return Thread.currentThread().getName();
}
public static void main(String args[]){
MyCallable myCallable=new MyCallable ();
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.submit (myCallable);
}
线程如何中断?
1.stop()方法:不在使用此方法,其中断线程是立即中断的,即使是在同步代码块中对数据进行操作时也会立即终止,详细不在赘述,只需知道该方法不在使用即可。
原因:https://docs.oracle.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html
2.通过修改共享变量来通知目标线程停止运行
这种方法有几个要求或注意事项:
(1)目标线程必须有规律的检查变量,当该变量指示它应该停止运行时,该线程应该按一定的顺序从它执行的方法中返回。
(2)该变量必须定义为volatile,或者所有对它的访问必须同步(synchronized)。
public class ThreadTest {
public static void main(String args[]){
Runner1 runner1=new Runner1 ();
Thread thread=new Thread (runner1);
thread.start ();
for(int i=0;i<100000;i++){
System.out.println(Thread.currentThread ().getName ()+" "+i);
}
runner1.exit=true;
}
}
class Runner1 implements Runnable{
public volatile boolean exit = false;
@Override
public void run(){
while (!exit){
System.out.println(Thread.currentThread ().getName ());
}
}
}
3.通过Thread.interrupt方法中断线程
interrupt():中断此线程。除非当前线程正在中断自身(这总是允许的),否则将调用该线程的checkAccess()方法,这可能导致抛出SecurityException。
如果这个线程在调用的wait(),join(),sleep(long)的方法,那么它的中断状态将被清除,它将收到InterruptedException。
如果该线程在上的I/O操作中被阻塞,则通道将被关闭,线程的中断状态将被设置,线程将收到ClosedByInterruptException。
如果这个线程在Selector中被阻塞,那么线程的中断状态将被设置,并且它将立即从选择操作返回,可能有一个非零值,就像选择器的wakeup一样。
如果前面的条件都不成立,那么将设置该线程的中断状态。
interrupted():测试当前线程是否已中断。这个线程的中断状态由该方法清除。
换句话说,如果要连续调用此方法两次,则第二次调用将返回false(除非当前线程在第一次调用清除其中断状态之后和第二次调用检查它之前再次中断)。线程中断被忽略,因为线程不存在。
在中断时,这种方法将反映出返回false。
isInterrupted():测试线程是否中断。中断的线程的状态不受该方法的影响。线程中断被忽略,因为线程不存在。在中断时将用这种方法来反映返回错误。
测试
public class ThreadTest {
public static void main(String args[]){
Runner1 runner1=new Runner1 ();
Thread thread=new Thread (runner1);
thread.start ();
for(int i=0;i<100000;i++){
System.out.println(Thread.currentThread ().getName ()+" "+i);
}
if (!thread.isInterrupted ()) {
thread.interrupt ();
System.out.println (thread.isInterrupted ());
runner1.exit=true;
}
}
}
class Runner1 implements Runnable{
public volatile boolean exit = false;
@Override
public void run(){
while (!exit){
System.out.println(Thread.currentThread ().getName ());
}
}
}