多线程Thread与后台线程setDaemon,使用Runnable接口创建多线程

 

Java多线程

进程:每个独立执行的程序就是进程,也就是正在进行的程序

线程:一个进程中可以包含一个或多个线程

 

多线程与单线程的对比:(图1)

 

用Thread类创建线程:

 

后台线程:如果我们对某个线程对象在启动之前调用setDaemon(true)方法,这个线程就变成后台线程

 

synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行 它包括两种用法:synchronized 方法和 synchronized 块。

使用Runnable接口创建多线程:多线程的应用,我们一般不直接继承(extends Thread)来实现多线程; 使用Runnable接口创建多线程可以更合理的分配资源

//多线程的在实际中的应用:网络聊天程序的收发,表记录的复制中途取消,www服务器为每一个来访者都建立专线服务

 

实现线程之间的同步:可以用同步函数也可以用同步代码块
同步代码块 和同步函数一起时必须使用this

出现死锁最明显的特征,程序停滞不前

 

下面程序是测试死锁问题所编写:修改掉部分注释内容适用于线程编写

 

 class ThreadDemo1 { public static void main(String[] args) { //new Thread().start(); //Thread tt=new TestThread(); //tt.setDaemon(true); /*Thread tt=new Thread(new TestThread()); tt.start();//run(); int index=0; while(true) { if(index++==100) try{tt.join(10000);}catch(Exception e){} System.out.println("main():"+Thread.currentThread().getName()); }*/ TestThread tt=new TestThread(); /*tt.start(); tt.start(); tt.start();*/ new Thread(tt).start(); try{Thread.sleep(10);}catch(Exception e){} tt.str=new String("method"); new Thread(tt).start(); //new Thread(tt).start(); //new Thread(tt).start(); } } class TestThread implements Runnable//extends Thread { int tickets=100; String str=new String(""); public void run() { if(str.equals("method")) { while(true) { sale(); } } else { while(true) { synchronized(str)//同步代码块 { if(tickets>0) { try{Thread.sleep(1);}catch(Exception e){} synchronized(this){} System.out.println(Thread.currentThread().getName()+"is naling ticket "+tickets--); } } } } } public synchronized void sale()//线程间同步synchronized 同步方法 { if(tickets>0) { try{Thread.sleep(10);}catch(Exception e){} synchronized(str){} System.out.print("sale(): "); System.out.println(Thread.currentThread().getName()+"is naling ticket "+tickets--); } } }

 

 

你可能感兴趣的:(JAVA学习笔记)