`

java 多线程的一些东西

    博客分类:
  • java
 
阅读更多

1.两种方式实现多线程

               一种是继承Thread类,一种是实现Runnable接口;

               Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限

                

class MyThread extends Thread{ 
    private String name; 
    public MyThread(String name) { 
        super(); 
        this.name = name; 
    } 
    public void run(){ 
        for(int i=0;i<10;i++){ 
           System.out.println("线程开始:"+this.name+",i="+i); 
        } 
    } 
} 

    public class ThreadDemo01 { 
       public static void main(String[] args) { 
            MyThread mt1=new MyThread("线程a"); 
           MyThread mt2=new MyThread("线程b"); 
            mt1.run(); 
            mt2.run(); 
    } 
} 

 

 

此时结果很有规律,先第一个对象执行,然后第二个对象执行,并没有相互运行。在JDK的文档中可以发现,一旦调用start()方法,则会通过 JVM找到run()方法。

        start()方法启动线程:

public class ThreadDemo01 { 
    public static void main(String[] args) { 
        MyThread mt1=new MyThread("线程a"); 
        MyThread mt2=new MyThread("线程b"); 
        mt1.start(); 
        mt2.start(); 
    } 
}; 

 

Runnable接口
在实际开发中一个多线程的操作很少使用Thread类,而是通过Runnable接口完成。

 

class MyThread implements Runnable{ 
    private String name; 
    public MyThread(String name) { 
        this.name = name; 
    } 
    public void run(){ 
        for(int i=0;i<100;i++){ 
            System.out.println("线程开始:"+this.name+",i="+i); 
        } 
    } 
}; 

 

 

 

但是在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。此时观察Thread类,有一个构造方法:public Thread(Runnable targer)
此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程。(start()可以协调系统的资源):

public class ThreadDemo01 { 
        public static void main(String[] args) { 
            MyThread mt1=new MyThread("线程a"); 
            MyThread mt2=new MyThread("线程b"); 
            new Thread(mt1).start(); 
            new Thread(mt2).start(); 
        } 
} 

 

 

两种实现方式的区别和联系:
在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:
->避免点继承的局限,一个类可以继承多个接口。
->适合于资源的共享

来源:http://xuyuanshuaaa.iteye.com/blog/1109498 谢谢作者
2.一些多线程的例子

 
A  1 有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC…

       由于线程执行的不确定性,要保证这样有序的输出,必须控制好多线程的同步。

 

线程同步有两种基本方法:

(1)    synchronized

(2)    wait,notify,notifyAll

 

现在分别采用这两种方法来解答这道题目。

/**
 */

/**

 *采用多线程技术打印10次“ABC”,即“ABCABC...”

 * 实现方式(一)利用synchronized关键字实现

 */

public class XunleiInterviewMultithread {
	public static void main(String[] args) {
		XunleiLock lock = new XunleiLock();

		new Thread(new XunleiPrinter("A", lock)).start();
		new Thread(new XunleiPrinter("B", lock)).start();
		new Thread(new XunleiPrinter("C", lock)).start();

	}
}
	class XunleiPrinter implements Runnable {
		private String name = "";
		private XunleiLock lock = null;
		private int count = 10;

		public XunleiPrinter(String name, XunleiLock lock) {
			this.name = name;
			this.lock = lock;
		}

		@Override
		public void run() {
			while (count > 0) {
				synchronized (lock) {
					if (lock.getName().equalsIgnoreCase(this.name)) {
						System.out.print(name);
						count--;
						if (this.name.equals("A")) {
							lock.setName("B");
						} else if (this.name.equals("B")) {
							lock.setName("C");
						} else if (this.name.equals("C")) {
							lock.setName("A");
						}
					}
				}
			}
		}
	}

	
class XunleiLock {

	public String name = "A";

	public String getName() {
		return name;

	}

	public void setName(String name) {
		this.name = name;
	}
}

 

 

方法(二)线程类修改如下,其他类一样:

class XunleiPrinter2 implements Runnable {

       private String name = "";

       private XunleiLock lock = null;

       private int count=10;

       public XunleiPrinter2(String name, XunleiLock lock) {

              this.name = name;

              this.lock = lock;

       }

       @Override

       public void run() {

              while(count>0) {

                     synchronized (lock) {

                            while(!lock.getName().equalsIgnoreCase(this.name)) {

                                   try{

                                          lock.wait();

                                   }catch(InterruptedException e){

                                          e.printStackTrace();

                                   }

                            }

                            System.out.print(name);

                            count--;

                            if (this.name.equals("A")) {

                                   lock.setName("B");

                            } elseif (this.name.equals("B")) {

                                   lock.setName("C");

                            } elseif (this.name.equals("C")) {

                                   lock.setName("A");

                            }

                            lock.notifyAll();

                     }

              }

       }

}

来源:http://www.blogjava.net/hankchen

分享到:
评论

相关推荐

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    Java的线程工具易于使用,并且像Java中的其他东西一样可以在不同的平台之间移植。这是一件好事,因为如果没有线程,那么除了最简单的applet之外,几乎不可能编写出任何程序。如果你想使用Java,就必须学习线程。 ...

    java多线程基础知识

    Java多线程基础知识 Java多线程基础知识是Java编程语言中的一项重要技术,用于提高程序的执行效率和响应速度。在这里,我们将详细介绍Java多线程基础知识的相关概念和技术。 一、程序、进程和线程 程序(Program...

    java多线程生产者与消费者案例

    关于java多线程的东西,里面有生产者与消费者的案例,感兴趣的朋友看一下吧。

    java多线程笔记

    一、认识多任务、多进程、单线程、多线程 要认识多线程就要从操作系统的原理说起。 以前古老的DOS操作系统(V 6.22)是单任务的,还没有线程的概念,系统在每次只能做一件事情。比如你在copy东西的时候不能rename...

    Java多线程编程总结

    要认识多线程就要从操作系统的原理说起。以前古老的DOS操作系统(V6.22)是单任务的,还没有线程的概念,系统在每次只能做一件事情。比如你在copy东西的时候不能rename文件名。为了提高系统的利用效率,采用批处理来...

    java多线程编程学习+例子程序+

    java多线程的非常好的学习资料,里面有适合初学者的资料,也有帮助高手提高水平的资料,还是蛮全面的,感觉学了这些东西,java多线程方面的技术也就差不多了。 里面包括一个很不错的例子程序,而且有详细注释。资料...

    Java多线程并发资料

    看了一下,是很久以前的资料,不过多线程向来是很经典的东西

    多线程设置优先级

    JAVA多线程,并设置优先级案例,一段完整的程序,加上自己的东西就可以跑起来

    多线程任务控制实例代码

    主要实现了,多个线程任务在同时执行的情况下,保证线程任务顺序的问题。更通俗来说,就是保证Thread1一定在thread2,thread3之后才能执行。另外,代码里我写了详细的注释,和测试的效果,绝对让你能看懂。还有我传的...

    Java线程,很全面地讲了java线程方面的东西,非常实用

    在Java中,多线程的特性使得程序能够并行执行不同的任务,从而提升效率。 1. **进程与线程的区别** - **粒度不同**:进程是资源分配的基本单位,而线程是CPU调度的基本单位。 - **内存地址空间**:每个进程拥有...

    Java多线程.xmind

    一些概念的东西,没啥价值。有个总体感觉就好

    基于JAVA的多线程实现方法-继承Thread类

    基于JAVA的多线程实现方法-继承Thread类,将需要实现多线程的类声明为继承Thread类,覆盖其run()方法,并将线程体放在该方法里。

    基于JAVA的多线程实现方法-实现Runnable接口

    基于JAVA的多线程实现方法-实现Runnable接口 将需要实现多线程的类声明为实现Runnable接口的类,实现run()方法,并将线程体放在该方法里。

    一些与java相关的东西

    在多线程环境中,main方法通常用于启动新的线程或者控制程序的流程。 最后,JDBC(Java Database Connectivity)是Java连接数据库的标准API,它提供了统一的方式来访问各种数据库。JDBC文档会详细解释如何建立...

    java学习路线图以及学习java要学习的东西

    Java提供了线程和同步机制,学习多线程编程,理解锁、同步块、线程池等概念,对提升程序性能至关重要。 最后,深入学习一些高级话题,如反射、动态代理、注解和泛型。这些特性让Java更加灵活和强大,也常用于框架...

    多线程扫描

    6. **编程实现**:在Java、C++、Python等编程语言中,都提供了支持多线程的库或原生支持。例如,Java的Thread类和Runnable接口,C++的std::thread,Python的threading模块,它们提供了创建、控制和同步线程的API。 ...

    龟兔赛跑——Java程序设计课程多线程部分教学设计.pdf

    "龟兔赛跑——Java程序设计课程多线程部分教学设计.pdf" 在 Java 程序设计课程中,多线程是一个重要且抽象的知识点。为了使学生更好地掌握多线程的概念,本文提出将龟兔赛跑的例子引入教学中。通过龟兔赛跑的例子,...

    java必须知道的东西

    - `StringBuffer`是可变的,允许在已有字符串上添加、删除字符,适合在多线程环境中进行字符串构建。 4. **异常处理**: - 异常是程序运行时的不正常情况。Java中的异常分为运行时异常(如`NullPointerException`...

Global site tag (gtag.js) - Google Analytics