Сделать существующий код в Java параллельным / многопоточным - PullRequest
8 голосов
/ 15 мая 2011

У меня очень простой гусеничный ход.Я хочу, чтобы мой текущий код выполнялся в несколько потоков.Не могли бы вы предоставить мне небольшой учебник или статью, чтобы помочь мне выполнить этот тест?

Я изначально являюсь разработчиком .Net, и в .Net у меня нет проблем с запуском кодов в многопоточном режиме, но, к сожалению, я не знаючто-нибудь о потоках в Java.

Мой сканер является программным обеспечением командной строки, поэтому не беспокойтесь о графическом интерфейсе.

Заранее спасибо.

Ответы [ 3 ]

9 голосов
/ 15 мая 2011

Java выполняет многопоточность через класс Thread.Один из наиболее распространенных способов сделать существующий код многопоточным - использовать интерфейс Runnable, чтобы определить, что вы хотите вызывать при запуске потока, а затем запустить его.

public class SomeFunctions
{
  public static void FunctionA() {}
  public static void FunctionB() {}
  public static void FunctionC() {}
}

// ...
Thread t1 = new Thread(new Runnable() {
   public void run() {
      SomeFunctions.FunctionA();
   }
});
t1.start();

// (rinse and repeat for the other functions)

Сухое кодирование, но оно должно выполняться припо крайней мере, получить общую концепцию.Конечно, как только вы входите в многопоточную среду, у вас возникают проблемы с параллелизмом, и вы должны убедиться, что все синхронизировано соответствующим образом и т. Д., Но у любого языка будут такие проблемы.

Если вы беспокоитесь о синхронизации, у вас есть несколько инструментов в вашем распоряжении.Самым простым является встроенная в Java функция рекурсивного мьютекса - ключевое слово «synchronized».Более классические средства также доступны через различные классы в пакетах java.util.concurrent и java.util.concurrent.locks, таких как Semaphore и ReadWriteLock

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html http://download.oracle.com/javase/6/docs/api/java/util/concurrent/locks/package-summary.html

6 голосов
/ 15 мая 2011

Вы можете взглянуть на мой пример веб-сканера.Приносим извинения за продолжительностьстраница для адресов электронной почты:

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * A Job which crawls HTTP or HTTPS URL's for email adresses, collecting new
 * URL's to crawl along the way.
 * 
 * @author Adriaan
 */
public class EmailAddressCrawlJob extends Job {

        @Override
        public void execute() {
                try {
                        URL url = new URL(getDescription());
                        if (url != null) {
                                String text = readText(url);
                                extractNewDescriptions(text, url);
                                extractResults(text);
                        }
                } catch (MalformedURLException e) {
                        System.err.println("Bad url " + getDescription());
                }
        }

        private String readText(URL url) {
                URLConnection connection;
                try {
                        connection = url.openConnection();
                        InputStream input = connection.getInputStream();
                        byte[] buffer = new byte[1000];
                        int num = input.read(buffer);
                        if (num > 0) {
                                StringBuilder builder = new StringBuilder();
                                builder.append(new String(buffer, 0, num));
                                while (num != -1) {
                                        num = input.read(buffer);
                                        if (num != -1) {
                                                builder.append(new String(buffer, 0, num));
                                        }
                                }
                                return builder.toString();
                        }
                } catch (IOException e) {
                        //System.err.println("Could not read from " + url);
                }
                return "";
        }

        private void extractNewDescriptions(String text, URL url) {

                // URL extracting code from Sun example
                String lowerCaseContent = text.toLowerCase();
                int index = 0;
                while ((index = lowerCaseContent.indexOf("<a", index)) != -1) {

                        if ((index = lowerCaseContent.indexOf("href", index)) == -1) {
                                break;
                        }

                        if ((index = lowerCaseContent.indexOf("=", index)) == -1) {
                                break;
                        }

                        index++;
                        String remaining = text.substring(index);
                        StringTokenizer st = new StringTokenizer(remaining, "\t\n\r\">#");
                        String strLink = st.nextToken();

                        if (strLink.startsWith("javascript:")) {
                                continue;
                        }

                        URL urlLink;
                        try {
                                urlLink = new URL(url, strLink);
                                strLink = urlLink.toString();
                        } catch (MalformedURLException e) {
                                // System.err.println("Could not create url: " + target
                                // + " + " + strLink);
                                continue;
                        }
                        // only look at http links
                        String protocol = urlLink.getProtocol();
                        if (protocol.compareTo("http") != 0
                                        && protocol.compareTo("https") != 0) {
                                // System.err.println("Ignoring: " + protocol
                                // + " protocol in " + urlLink);
                                continue;
                        }
                        addNewDescription(urlLink.toString());
                }
        }

        private void extractResults(String text) {
                Pattern p = Pattern
                                .compile("([\\w\\-]([\\.\\w])+[\\w]+@([\\w\\-]+\\.)+[A-Za-z]{2,4})");
                Matcher m = p.matcher(text);
                while (m.find()) {
                        addResult(m.group(1));
                }
        }
}

Я знаю, что этот ответ немного многословен, но я подумал, что OP лучше всего поможет с рабочим примером, и я случайно создал его не так давно.

1 голос
/ 16 ноября 2016

Очень простая Java-программа, которая даст абстрактное представление о многопоточности.

public class MyThread extends Thread {

  String word;

  public MyThread(String rm){
    word = rm;
  }

  public void run(){

    try {

      for(;;){
        System.out.println(word);
        Thread.sleep(1000);
      }

    } catch(InterruptedException e) {

      System.out.println("sleep interrupted");      
    }
  }

  public static void main(String[] args) {

    Thread t1=new MyThread("First Thread");
    Thread t2=new MyThread("Second Thread");
    t1.start();
    t2.start();
  }
} 

И на выходе будет ..

First Thread
Second Thread
First Thread
Second Thread
First Thread

Пойдите с этим PPT, это поможет вам с основами.

Здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...