当前位置:编程学习 > JAVA >>

[java]线程

线程:是进程的一部分

           ---实现多线程的两种方式

               ---创建一个类实现Runnable接口,以这个类的对象作为创建Thread类的对象的构造函数的参数

               ---直接继承Thread类,重写run方法

           ---在main函数中有t.join()---即等线程t结束后,当前线程(main)才能执行

           ---Thread.yeild()---主动放弃CPU的使用权进入ready状态

           ---设置优先级---t.setPriority()---参数为Thread.MAX_PRIORITY--最高优先级;MIN_PRIORITY---最低优先级

           ---守护线程---在没有用户线程时,自动离开,这个线程有最低的优先级

                                 eg:  java垃圾回收线程---当我们的程序不再有运行中的Thread,程序就不会产生垃圾,当成为虚                                         拟机上仅剩的线程时 ,java虚拟机会自动离开---运行后台的一种特殊线程---不依赖线程,依                                         赖系统

                                  t.setDaemon(true)--设置t线程为守护线程

           ---同步块---eg:多个线程共享同一数据的问题---每个对象对应一把锁

                            

[java] 
package guo; 
 
public class A { 
    public static void main(String[] args) { 
        Object resource=new Object(); 
          MyThread mt1=new MyThread(resource,"MT1"); 
          MyThread mt2=new MyThread(resource,"MT2"); 
          mt1.start(); 
          mt2.start(); 
    } 

//自定义的线程类 
class MyThread extends Thread{ 
    private Object resource; 
    public MyThread(){} 
    public MyThread(Object resource,String name){ 
        this.resource=resource; 
        this.setName(name); 
    } 
    public void run(){ 
        synchronized(resource){//同步语句块 
        System.out.println(this.getName()+"线程访问了资料!!!"); 
        System.out.println(this.getName()+"线程带着锁睡觉去了!!!"); 
        try{ 
            Thread.sleep(5000);//睡5000ms后醒来 
        }catch(InterruptedException e){ 
            e.printStackTrace(); 
        } 
     System.out.println(this.getName()+"线程带着锁睡醒后释放了锁!!!"); 
     } 
   } 

 
/**
 * 此程序运行的结果为:
 *   MT1线程访问了资料!!!
 *   MT1线程带着锁睡觉去了!!!
 *   MT1线程带着锁睡醒后释放了锁!!!
 *   MT2线程访问了资料!!!
 *   MT2线程带着锁睡觉去了!!!
 *   MT2线程带着锁睡醒后释放了锁!!!
 */ 

           ---同步函数---每个类的实例对应一把锁---方法一旦执行就独占锁---静态方法用的锁是该方法所属类的字节码对                象上的锁


[java] 
package guo; 
 
public class Single1 { 
    public static void main(String[] args) { 
        A2 a = new A2(); 
        Thread t1 = new Thread(a); 
        Thread t2 = new Thread(a); 
        t1.start(); 
        t2.start(); 
    } 

 
class A2 implements Runnable { 
    int i; 
    @Override 
    public  void run() { 
        doSomeThing(); 
    } 
 
    /*同步函数一样是需要获取一把钥匙,该钥匙是哪个对象的呢?*/ 
    public  synchronized void doSomeThing() { 
        for (int j = 1; j <= 10; j++) { 
            int h = i + 1; 
            try { 
                Thread.sleep(100); 
            } catch (InterruptedException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            } 
            i = h; 
            System.out.println(i); 
        } 
    } 

          ---线程间的通讯问题
              ---通过管道流的方式---简单、效率低,复杂数据和对象不好处理


[java]
package guo; 
 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.PipedInputStream; 
import java.io.PipedOutputStream; 
import java.util.Random; 
 
public class Single2 { 补充:软件开发 , Java ,

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,