进程是程序的一次动态的执行过程,它经历了从代码加载、执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到最终消亡的过程。
  多线程是实现并发机制的一种有效的手段。进程和线程一样,都是实现并发的一个基本单位。
  如果现在同时运行多个任务,则所有的系统资源将是共享的,补所有线程所公用,但是程序处理需要CPU,传统的单核CPU来说 ,在同一个时间段上会有多个程序执行,但是在同一个时间点上只能存在一个程序运行,也就是说,所有的程序都要抢占CPU资源
  但是现在的CPU已经发展到多核状态了,在一个电脑上可能会存在多个CPU,那么这个时候就可以非常清楚的发现多线程操作间是如何并发执行的,那么本机的CPU是双核的。

JAVA的多线程实现
两种方式实现多线程:
  1)继承Thread类
  2)实现Runnable接口

继承Thread类
    Thread类是在java.lang包中定义的,一个类只要继承了Thread类,此类就称为多线程操作类。在Thread子类之中,必须明确的复写Thread类中的run()方法,此方法为线程的主体。

class 类名称 extends Thread{
属性...;
方法...;
//复写Thread类中的run()方法,此方法为线程主体
public void run(){
线程主体;
}
}

java.lang 包含在程序运行时自动导入,所以无需手工编写import语句。
一个类继承了Thread类之后,那么此类就具备了多线程的操作功能。

class Mythread1 extends Thread{
private String name;
public Mythread1(String name){
this.name=name;
}
public void run(){
for(int i=0; i<10;i++){
System.out.println(name + "运行,i="+i);
}
}
}

启动线程必须使用Thread类中定义的start()方法,一旦调用start()方法,实际最终调用的是run()方法。

class Mythread1 extends Thread{
private String name;
public Mythread1(String name){
this.name=name;
}
public void run(){
for(int i=0; i<10;i++){
System.out.println(name + "运行,i="+i);
}
}
}
public class Mythread { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Mythread1 mt1=new Mythread1("线程A");
Mythread1 mt2=new Mythread1("线程B");
mt1.start();
mt2.start();
}
}

同一个对象多次调用start()方法,会抛出:IllegalThreadStateException - 如果线程已经启动。

实现Runnable接口

class Mythread1 implements Runnable {
private String name;
public Mythread1(String name){
this.name=name;
}
public void run(){
for(int i=0; i<10;i++){
System.out.println(name + "运行,i="+i);
}
}
}
public class MyThread { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Mythread1 mt1=new Mythread1("线程A");
new Thread(mt1).start();
} }

两种实现方式的区别

对于Thread类和Runnable接口本身都是可以进行多线程的实现,那么两都到底使用区别。
 1)继承局限:使用Runnable接口可以避免单继承的局限,而Thread类有此局限。
 2)资源共享:使用Runnable接口可以实现多线程资源的共享,而Thread类却无法实现。
 Thread 类定义 :public class Thread extends Object implements Runnable
  发现Thread类实际上是Runnable的子类。而且Thread类也要去接收Runnable其他子类对象,而且所有的线程中,通过Runnable接口实现的线程类里面都是编写的具体功能,而并没有所谓的CPU调度,而真正意义的CPU调度由操作系统完成(通过Thread类的start()方法调用的)。
  Thread类要去协调操作系统,并且最终还要执行具体的纯种主体的方法,而线程的主体呢,现在只专著于具体的功能实现,至于如何调度根本不管。

java多线程操作的更多相关文章

  1. Java多线程操作同一个对象,线程不安全

    Java多线程操作同一个对象 发现问题:多个线程操作同一资源的情况下,线程不安全,数据紊乱 代码: package multithreading; // Java多线程操作同一个对象 // 买火车票的 ...

  2. java 多线程操作List,已经做了同步synchronized,还会有ConcurrentModificationException,知道为什么吗?

    如题,最近项目里有个模块我做了异步处理方面的事情,在code过程中发现一个颠覆我对synchronized这个关键字和用法的地方,请问各位java开发者们是否对此有一个合理的解释,不多说,我直接贴出问 ...

  3. 【转】Java多线程操作局部变量与全局变量

    原文网址:http://blog.csdn.net/undoner/article/details/12849661 在这篇文章里,我们首先阐述什么是同步,不同步有什么问题,然后讨论可以采取哪些措施控 ...

  4. Java多线程操作局部变量与全局变量

    在这篇文章里,我们首先阐述什么是同步,不同步有什么问题,然后讨论可以采取哪些措施控制同步,接下来我们会仿照回顾网络通信时那样,构建一个服务器端的"线程池",JDK为我们提供了一个很 ...

  5. Java多线程操作同一份资源

    现在两个线程,可以操作初始值为零的一个变量,实现一个线程对该变量加1,一个线程对该变量减1,实现交替,来10轮,变量初始值为零. package com.yangyuanyuan.juc1205; i ...

  6. java 多线程操作(锁)

    1.对象的加锁及其操作 程序中单独的并发线程对同一对象进行操作的代码段,成为临界区.java语言中的临界区可以是一个语句块 或者方法,使用关键字synchronized进行标识. 对象锁:java平台 ...

  7. java 多线程12 : 无锁 实现CAS原子性操作----原子类

    由于java 多线程11:volatile关键字该文讲道可以使用不带锁的情况也就是无锁使变量变成可见,这里就理解下如何在无锁的情况对线程变量进行CAS原子性及可见性操作 我们知道,在并发的环境下,要实 ...

  8. Java多线程对同一个对象进行操作

    示例: 三个窗口同时出售20张票. 程序分析: 1.票数要使用一个静态的值. 2.为保证不会出现卖出同一张票,要使用同步锁. 3.设计思路:创建一个站台类Station,继承THread,重写run方 ...

  9. java多线程的操作

    上篇博客简单了介绍了Java的多线程的概念,与进程的区别,两种创建方式,状态及获取线程名称等内容.这篇文章接着介绍Java的多线程.主要从一下几方面介绍. 1 线程类的常用方法 1.1 start() ...

随机推荐

  1. (转)浅谈Java中的equals和==

    原文地址: http://www.cnblogs.com/dolphin0520/p/3592500.html 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new S ...

  2. Linux网络编程-IO复用技术

    IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...

  3. SQL用法操作合集

    SQL用法操作合集   一.表的创建 1.创建表 格式: 1 CREATE TABLE 表名 2 (列名 数据类型(宽度)[DEFAULT 表达式][COLUMN CONSTRAINT], 3 ... ...

  4. 超简单——自己搭建ftp服务器

    自己搭建ftp服务器 之所以没选择serv-u,一是因为收费,虽说网上有破解版,但是使用过程中发现破解版很不稳定,经常异常死掉,随后改选用免费的filezilla. 1软件获取 从百度搜索 FileZ ...

  5. [LeetCode] Longest Substring Without Repeating Characters 最长无重复子串

    Given a string, find the length of the longest substring without repeating characters. For example, ...

  6. 给空签名包进行签名以及找不到keystore证书链问题的解决方案

    转 http://blog.csdn.net/u011106842/article/details/49683865

  7. Dubbo_异常_Service启动时默认将方法注册到内网IP

    一.背景 一般Dubbo服务都是通过内网调用,Dubbo服务启动时默认会将服务注册到内网IP,消费端就无法从外网访问. 二.解决过程 1.Linux的hosts中设置外网IP a) 通过hostnam ...

  8. Junit的使用

    Junit是用于编写单元测试的框架.对于已经写好的函数,可以使用Junit生成单元测试代码. 自己的环境是:Linux Java环境是:JDK1.7 IDE:Eclipse Java EE IDE f ...

  9. layer.open打开iframe页面的调用父页面方法及关闭

    //调用父类方法 window.parent.exportData($('#shownum').val(),$('#splitstr').val()); //关闭iframe页面var index = ...

  10. 【BZOJ-2938】病毒 Trie图 + 拓扑排序

    2938: [Poi2000]病毒 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 609  Solved: 318[Submit][Status][Di ...