基础知识

每个正在系统上运行的程序都是一个进程(process)。每个进程包含一到多个线程(thread)。进程也可能是整个程序或者是部分程序的动态执行。

线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。

Java对多线程的支持是非常强大的,他屏蔽掉了许多的技术细节,让我们可以轻松的开发多线程的应用程序。Java里面有2个方法实现多线程,

  1. 1 继承 Thread类,比如
  2.   class MyThread extends Thread {
  3.    public void run() {
  4.    // 这里写上线程的内容
  5.    }
  6.    public static void main(String[] args) {
  7.    // 使用这个方法启动一个线程
  8.    new MyThread().start();
  9.    }
  10.   }
  11.   2 实现 Runnable接口,例如
  12.   class MyThread implements Runnable{
  13.    public void run() {
  14.    // 这里写上线程的内容
  15.    }
  16.    public static void main(String[] args) {
  17.    // 使用这个方法启动一个线程
  18.    new Thread(new MyThread()).start();
  19.    }
  20.   }
  21. 一般鼓励使用第二种方法,因为Java里面只允许单一继承,但允许实现多个接口。第二个方法更加灵活。

代码示例

多线程实现1-30的累计,其中共享资源池为1-30的数字的递增,采用了同步锁synchronized。

  1. class Sum{ //共享资源,计数器count
  2. private int count;//共享资源
  3. public int add(){
  4. synchronized(this){ //代码段1,共享锁,修饰程序段或者方法
  5. count = count + 1;
  6. System.out.println("add:" + count);
  7. return count;
  8. }
  9. }
  10. }
  11. class SumThread implements Runnable{//定义线程
  12. private Sum sd;
  13. private int sum = 0;
  14. private int [] a = new int[10];
  15.  
  16. public SumThread(String name, Sum sd){
  17. super(name);
  18. this.sd = sd;
  19. }
  20. public void run(){//必需的重写
  21. try{
  22. for(int i=0;i<10;i++){
  23. a[i] = sd.add();
  24. sum += a[i];
  25. Thread.sleep(100);
  26. }
  27. Thread.sleep(1000);
  28. }catch(Exception e){}
  29.  
  30. System.out.println(getName() + "累加和:" + sum);
  31. }
  32. public void showData(){
  33. System.out.print(getName() + "获得的数为");
  34. for(int i=0;i<10;i++){
  35. if(i%10==0)System.out.println();
  36. System.out.print(a[i] + "+\t");
  37. }
  38. }
  39. public int getSum(){
  40. return sum;
  41. }
  42. }
  43. public class SumDemo{
  44. public static void main(String [] args){
  45. Sum sd = new Sum();//代表共享资源的变量
  46. SumThread s1 = new SumThread("线程1",sd);//创建完毕
  47. SumThread s2 = new SumThread("线程2",sd);
  48. SumThread s3 = new SumThread("线程3",sd);
  49. Thread st1 = new Thread(s1);
  50. Thread st2 = new Thread(s2);
  51. Thread st3 = new Thread(s3);
  52. st1.setPriority(Thread.MAX_PRIORITY); //代码段2
  53. st2.setPriority(10);
  54. st3.setPriority(1);
  55. long begin = System.currentTimeMillis();
  56. st1.start();//使线程运行
  57. st2.start(); st3.start();
  58. St1.join(); st2.join(); st3.join();
  59. st1.showData();
  60. st2.showData();
  61. st3.showData();
  62. System.out.println("总和为:" + (st1.getSum() + st2.getSum() + st3.getSum()));
  63. long end = System.currentTimeMillis();
  64. System.out.println(“探测localhostTCP端口,共耗时” +
  65. ( end - begin)+"毫秒");
  66. } }

TCP Socket多线程通信

服务端:

  1. import java.io.*;
  2. import java.net.*;
  3. import java.util.*;
  4. @SuppressWarnings(value={"deprecation","unchecked"}) //查阅该语句作用
  5. public class MultiServer extends Thread{
  6. ServerSocket serverSocket = null;
  7. boolean listening = true;
  8. int port = 1080;
  9. int count;
  10. public MultiServer(){
  11. try{
  12. serverSocket = new ServerSocket(port);
  13. System.out.println("The Chat Server is listening on " + port);
  14. }catch(IOException e){
  15. System.err.println("Can't listen on Port");
  16. System.exit(1);
  17. }
  18. count = 0;
  19. while(listening){
  20. try{
  21. new ClientServiceThread(serverSocket.accept()).start();
  22. count += 1;
  23. System.out.println("The Chat Server get " + count + " Clients");
  24. }catch(IOException e){
  25. System.err.println("Can't Accept the Client Connection Apply");
  26. }
  27. }
  28. try{
  29. serverSocket.close();
  30. }catch(IOException e){
  31. System.exit(1);
  32. }
  33. this.start();
  34. }
  35. public static void main(String args[]){
  36. MultiServer ms = new MultiServer();
  37. } }

客户端:

  1. class ClientServiceThread extends Thread{
  2. private String name = "Client";
  3. private Socket socket = null;
  4. private Vector clients = null;
  5. public ClientServiceThread(Socket socket){
  6. super("ClientServiceThread");
  7. this.socket = socket;
  8. }
  9. public ClientServiceThread(Vector clients, Socket socket){
  10. super("ClientServiceThread");
  11. this.socket = socket;
  12. this.clients = clients;
  13. }
  14. public void run(){
  15. try{
  16. DataInputStream in = new DataInputStream(new
  17. BufferedInputStream(socket.getInputStream()));
  18. PrintStream out = new PrintStream(new
  19. BufferedOutputStream(socket.getOutputStream(), 1024), true);
  20.  
  21. String inputLine, outputLine;
  22.  
  23. GreetingProtocol greeting = new GreetingProtocol();
  24. outputLine = greeting.processInput(null);
  25.  
  26. out.println("Welcome to My Chat Server, Please REG your Name, Format: name = yourname");
  27. out.flush();
  28.  
  29. while((inputLine = in.readLine()) != null){
  30. System.out.println(this.name + " Say: " + inputLine);
  31. if(inputLine.startsWith("name")){
  32. this.name =
  33. inputLine.substring(inputLine.indexOf("=") + 1);
  34. out.println("Your Name "+ this.name + " is REG");
  35. out.flush();
  36. }else{
  37. outputLine = greeting.processInput(inputLine);
  38. out.println(outputLine);
  39. out.flush();
  40. }
  41. if(inputLine.equals("bye")) break;
  42. }
  43. out.close();
  44. in.close();
  45. socket.close();
  46. }catch(IOException e){
  47. e.printStackTrace();
  48. } } }

Java学习---多线程的学习的更多相关文章

  1. 【Java】多线程_学习笔记

    多线程 1.进程 进程:当一个程序进入内存运行时,它就成为了进程.进程具有独立性.动态性.并发性. A.独立性:进程是系统中独立存在的实体,它可以拥有自己独立的资源,每一个进程都拥有自己私有的地址空间 ...

  2. Java核心知识点学习----多线程中的阻塞队列,ArrayBlockingQueue介绍

    1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过s ...

  3. Java多线程技术学习笔记(二)

    目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和w ...

  4. java多线程入门学习(一)

    java多线程入门学习(一) 一.java多线程之前 进程:每一个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销.一个进程包括1--n个线程.     线程:同一类线程共享代码 ...

  5. Java多线程编程(学习笔记)

    一.说明 周末抽空重新学习了下多线程,为了方便以后查阅,写下学习笔记. 有效利用多线程的关键是理解程序是并发执行而不是串行执行的.例如:程序中有两个子系统需要并发执行,这时候需要利用多线程编程. 通过 ...

  6. Android学习记录(5)—在java中学习多线程下载之断点续传②

    在上一节中我们学习了在java中学习多线程下载的基本原理和基本用法,我们并没有讲多线程的断点续传,那么这一节我们就接着上一节来讲断点续传,断点续传的重要性不言而喻,可以不用重复下载,也可以节省时间,实 ...

  7. Java学习多线程第一天

    内容介绍 Thread 线程创建 线程池 线程状态图 1 多线程 1.1     多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序 ...

  8. 多线程--毕向东java基础教程视频学习笔记

    目录 1.多线程运行的安全问题 2.多线程同步代码块 3.同步方法的锁是this 4.静态同步方法的锁是Class对象 5.单例设计模式(面试中的考点) 6.死锁(一个发生死锁的例子) 多线程运行的安 ...

  9. 2.1多线程(java学习笔记) java中多线程的实现(附静态代理模式)

    一.多线程 首先我们要清楚程序.进程.线程的关系. 首先进程从属于程序,线程从属于进程. 程序指计算机执行操作或任务的指令集合,是一个静态的概念. 但我们实际运行程序时,并发程序因为相互制约,具有“执 ...

随机推荐

  1. 030-ftputils工具栏模板

    模板一: package cn.e3mall.common.utils; import java.io.File; import java.io.FileInputStream; import jav ...

  2. 【LESS系列】内置函数说明

    本文转自 http://www.cnblogs.com/zfc2201/p/3493335.html escape(@string); // 通过 URL-encoding 编码字符串 e(@stri ...

  3. C 标准库 - ctype.h之isalpha使用

    isalpha int isalpha ( int c ); Checks whether c is an alphabetic letter. 检查给定字符是否字母字符,即是大写字母( ABCDEF ...

  4. 什么是SharePoint?

    在聊SharePoint开发之前,有必要说下什么是SharePoint. 在我工作的过程中,经常遇到客户对SharePoint不太了解的情况.有客户说,SharePoint太烂了,DropBox能做到 ...

  5. oracle用plsql登陆出错,提示ORA-12170:TNS:链接超时 --------关闭防火墙试试

    oracle用plsql登陆出错,提示ORA-12170:TNS:链接超时 但是使用sqlplus可以连接 ping 本机127.0.0.1 显示一般故障 后关闭防火墙,问题解决. ps:登录时使用@ ...

  6. 网页title添加图标

    <link rel="shortcut icon" href="1.ico"> href="图片名字.ico"; 图片后缀名为: ...

  7. 可变参数的lambda表达式

    delegate int mydelegate(params int[] a); class Program { static void Main(string[] args) { //接收可变参数的 ...

  8. 使用StackPanel进行简单地布局

    尽管StackPanel非常简单,但是其实用性也非常强 ,Stackpanel将子元素以堆叠的形式 排列在一行或一列.通常建议使用该控件对于一些小范围内的控件进行布局. 如果要架设用户控件的框架结构, ...

  9. C# 之构造函数

    构造函数是一种特殊的成员函数,它主要用于为对象分配存储空间,对数据成员进行初始化. 构造函数具有一些特殊的性质: (1)构造函数的名字必须与类同名; (2)构造函数没有返回类型,它可以带参数,也可以不 ...

  10. ADO MFC SQL2000

    对于初学VC的朋友来说,连接数据库其实是一件不容易的事情.记得我当时为了与数据库连接上,找了好多资料,上网看了好多文章,都没有解决这个问题.后 来,有个网友帮我解决了,我再次表示感谢.为了后来VC初学 ...