Смотритель: hubert
  • ,

Немного вопросов по нитям с собственными примерами.

Создал класс
SomeThread implements Runnable
В нем один метод
incrementString();
добавляющий букву к строке и выводящий строки на консоль. Метод вызывается через
run();
Если
incrementString();
пометить synchronized, то вывод стабильно такой:
a-b Thread-1
aa-bb Thread-0

А если без synchronized (как в коде ниже), то выводит, кроме прочих вариантов и так:
a-b Thread-1
a-b Thread-0
Не могу понять почему так происходит. Получается, что одна из нитей не выполняет операцию
s1 +=
или
s2 +=
Кто поможет разобраться в этом конкретном примере? Заранее спасибо)

public class TestThread
{
    public static void main(String[] args)
    {
        SomeThread someThread = new SomeThread();

        Thread thread1 = new Thread(someThread);
        Thread thread2 = new Thread(someThread);

        thread1.start();
        thread2.start();
    }
}

class SomeThread implements Runnable
{

    String s1 = "";
    String s2 = "";

    @Override
    public void run()
    {
        try
        {
            incrementString();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    void incrementString() throws IOException
    {
        s1 += "a";
        s2 += "b";
        System.out.println(s1+ "-" + s2 + " " + Thread.currentThread().getName());
    }
}

Синхронизация и её корректное использование.

Мини введение.
Убился, решая две бонусные задачи CrUD 17 лвла. Готов был задушить составителей этих задач, но оба раза не принималось по моей вине (тупо забывал убрать код для тестирования кода :)). Так что, разрабы, извините, если что, проклятия с вас снял)) Но не об этом сейчас…

Проблема.
Хочется с людьми поспорить на тему: какие методы нуждаются в синхронизации, в синхронизации по классу или его объекту или вообще по чему-нибудь ещё))) Проштудировал лекции 17 уровня, читал главу про трэды Эккеля (ну и мудрёно пишет, философ), но мог что пропустить, поэтому не сильно пинайте) Для примера возьмём ту самую бонусную задачу CrUD Batch. Код не ищите, всё нужное сейчас здесь будет))

Есть там список, поле класса:
public static List<Person> allPeople = new ArrayList<Person>();

Не вдаваясь в подробности, скажу, что список редактируется числом методов (ну или просто используется ими). Начал я вроде как книгу писать, но в принципе на этом повествование заканчивается. Вот вам эти методы, прошу объяснить, какие из них и как нужно синхронизировать (ну или хотя бы ткните в какую-нибудь ссылку носом))).

public static void create(String name, String sex, String bd) throws ParseException
    {
        if (sex.equals("м")) allPeople.add(Person.createMale(name, inFormat.parse(bd)));
        else if (sex.equals("ж")) allPeople.add(Person.createFemale(name, inFormat.parse(bd)));

        System.out.println(allPeople.size() - 1);
    }

    public static void update(int id, String name, String sex, String bd) throws ParseException
    {
        if (sex.equals("м"))
        {
            allPeople.get(id).setName(name);
            allPeople.get(id).setSex(Sex.MALE);
            allPeople.get(id).setBirthDay(inFormat.parse(bd));
        } else if (sex.equals("ж"))
        {
            allPeople.get(id).setName(name);
            allPeople.get(id).setSex(Sex.FEMALE);
            allPeople.get(id).setBirthDay(inFormat.parse(bd));
        }
    }

    public static void delete(int id)
    {
        allPeople.get(id).setBirthDay(null);
    }

    public static void info(int id)
    {
        System.out.println(allPeople.get(id).getName() + (allPeople.get(id).getSex().equals(Sex.MALE) ? " м " : " ж ") + outFormat.format(allPeople.get(id).getBirthDay()));
    }
  • ,

Как выйти на иностранного заказчика?

Здесь учится много людей. И каждый задумывается над применением полученных знаний. А есть и те, кто уже имеет практический опыт. Хотелось бы узнать как получить бесценный опыт работы с иностранными заказчиками. Для начала деньги не важны, нужен именно опыт и знания. Естественно, большим камнем преткновения становиться знание иностранного языка. Достаточно ли уметь писать и читать на английском. Либо без разговорного английского не обойтись? Может у кого-то есть реальные примеры начала работы с зарубежными работодателями через интернет? Спасибо за любую информацию. Ведь на просторах постсоветского пространства не всегда легко найти работы, особенно если город не очень большой.

WEGAME – главное событие играющей Украины

Интересное мероприятие от наших партнеров

16-17 апреля 2016 года в Киеве состоится международная фестиваль интерактивных развлечений WEGAME. Каждый поклонник виртуальных миров и электронных развлечений уже запасается билетами!

WEGAME – это настоящий рай для фаната видеоигр! Здесь можно увидеть самые свежие компьютерные и консольные игры, поиграть в них, подержать в руках долгожданные мобильные хиты, перекинуться парой слов с настоящими живыми разработчиками и побывать на презентации всех тех проектов, что заставляют геймеров страдать от бессонницы и мучиться от нетерпения. WEGAME – это всё самое-самое! Самые яркие презентации, самые увлекательные конкурсы, самые красивые девушки-промоутеры, самые напряжённые турниры, самые крутые призы и всё то, что греет сердце любого фаната интерактивных развлечений!

Именно на WEGAME впервые в Украине будут представлены последние новинки ведущих отечественных и зарубежных компаний. Воспользуйтесь шансом увидеть, пощупать и поиграть в главные проекты игровой индустрии задолго до того, как они попадут в руки игроков! Зачем смотреть трейлеры на YouTube, если можно прийти на выставку и поиграть?

Гостей WEGAME ожидает погружение в VR-реальность посредством новейших очков, масштабная презентация консольных новинок, демонстрационные стенды, на которых посетители смогут опробовать последние достижения компьютерной техники и самые новые мобильные устройства!

Фанаты киберспорта в течение WEGAME смогут лично наблюдать за соревнованиями любимых отечественных и зарубежных команд Высшей лиги. Самые удачливые и настырные смогут пообщаться с людьми, которые сделали себе имя в мире прогейминга, и получить советы и мастер-классы от «звёзд».

Гости выставки смогут купить самые новые игры, геймпады, профессиональные игровые мыши и другое важное для каждого игрока оборудование по специальным ценам! Фанатам поп-культуры представится возможность отовариться сувенирами, статуэтками любимых персонажей фильмов и игр, а также другими интересными штуковинами – никто не уходит с WEGAME с пустыми руками!

Фанаты косплея, мастера перевоплощения и люди, способные отличить Гульдана от Артаниса, смогут показать себя во всей красе и посмотреть на красу других. В рамках специальной программы WEGAME приглашает всех косплееров представить свои самые любимые образы и самые лучшие работы в кругу единомышленников. Здесь вас оценят по достоинству!

Не пропустите! 16-17 апреля 2016-го, НСК «Олимпийский». Главное событие года в мире игр. Приходите – не пожалеете!
Прямо сейчас на нашем сайте можно узнать, как идёт подготовка к событию, и поделиться впечатлениями: wegame.com.ua/.

Присоединяйтесь к нашим официальным группам в социальных сетях: FB и ВК.

Контакты организаторов:
+38 044 392 06 96
client@smileexpo.com.ua
  • ,

Оформление кода

Одну из задач (которая была решена и принята сервером) я реализовал в виде кода (забил * и X-ми чтобы не спойлерить).

/* xxx
1. Считывать строки(параметры) с консоли, пока пользователь не введет пустую строку(Enter).
2. Каждый параметр соответствует имени ***.
Для каждого параметра:
3. Создать объект *** класса ***, который равен *** из getX(String параметр).
4. Вывести на экран toString().
*/

public class Solution
{
    public static void main(String[] args) throws Exception
    {
        //Add your code here
        List<String> al= new ArrayList<>();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String str;
        while(!"".equals(str = reader.readLine())) al.add(str);
        for (int i = 0; i <al.size(); i++) System.out.println(XFactory.getX(al.get(i)).toString());
    }
...

Зашедший в гости полузнакомый раскритиковал, что так не пишут (это тебе не C и т.п.).
Не подскажете в чем я не прав (есть какие нормы и общепринятые стандарты)?
Или использование в одной строчке нескольких конструкций (оно вообще, без промежуточных присваиваний временным переменным, может привести в каких-либо ситуациях к каким-либо возможным последствиям?) — дурной тон?
Основные переменные (al, reader, str) объявлены до их использования (pascal-стиль), так как мне удобнее, всегда знаешь где можешь найти описание переменной с возможным комментарием.
Вспомогательные переменные объявлены в нужной зоне видимости (как переменная цикла i).
Idea не ругается, правда предлагает 2 опции:
Split into declaration and assigment (таки разделить объявление и присваивание) и заключить некоторые участки в блок try.

Как бы Вы правильнее написали код?

Что не так?
Для такой задачи не стоит комментировать каждую строчку.

Thinking in Java, глава 8. Вопрос по приведённому в книге коду.

//: polymorphism/ReferenceCounting.java
//  Уничтожение совместно используемых встроенных объектов
import static net.mindview.util.Print.*;
 
class Shared {
  private int refcount = 0;
  private static long counter = 0;
  private final long id = counter++;
  public Shared() {
    print("Creating " + this);
  }
  public void addRef() { refcount++; }
  protected void dispose() {
    if(--refcount == 0)
      print("Disposing " + this);
  }
  public String toString() { return "Shared " + id; }
}
 
class Composing {
  private Shared shared;
  private static long counter = 0;
  private final long id = counter++;
  public Composing(Shared shared) {
    print("Creating " + this);
    this.shared = shared;
    this.shared.addRef();
  }
  protected void dispose() {
    print("disposing " + this);
    shared.dispose();
  }
  public String toString() { return "Composing " + id; }
}
 
public class ReferenceCounting {
  public static void main(String[] args) {
    Shared shared = new Shared();
    Composing[] composing = { new Composing(shared),
      new Composing(shared), new Composing(shared),
      new Composing(shared), new Composing(shared) };
    for(Composing c : composing)
      c.dispose();
  }
}


Программа работает верно, на экран выводится:
Creating Shared 0
Creating Composing 0
Creating Composing 1
Creating Composing 2
Creating Composing 3
Creating Composing 4
disposing Composing 0
disposing Composing 1
disposing Composing 2
disposing Composing 3
disposing Composing 4
Disposing Shared 0


Вопрос по методу dispose() класса Shared. Метод выполнится только при refcount == 1, но я нигде не вижу декрементации данной переменной, вот и возник вопрос: благодаря чему выводится последняя строка?

JSOUP + multipart/form-data response

Добрый день,
В общем необходимо отправить на сайт данные в виде ответа в форме multipart/form-data.

Перехватить запрос генерируемый браузером труда не составляет, но выполнить такой же с помощью JSOUP вызывает сложности.

В качестве примера можно взять простейшую форму, которая сгенирирует нужный запрос.
<form action=«localhost:8000» method=«post» enctype=«multipart/form-data»
<input type=«text» name=«text» value=«text default»
<input type=«file» name=«file1»
<input type=«file» name=«file2»
Submit</button
</form

Запрос:
->Request Headers
Provisional headers are shown
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryjtkXVNw9YVG1H2P9
Origin:null
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id:8DCCE949-56FA-4AB0-81B7-DA2BC7960E5C

->Request Payload
------WebKitFormBoundaryjtkXVNw9YVG1H2P9
Content-Disposition: form-data; name=«text»

text default
------WebKitFormBoundaryjtkXVNw9YVG1H2P9
Content-Disposition: form-data; name=«file1»; filename=""
Content-Type: application/octet-stream

------WebKitFormBoundaryjtkXVNw9YVG1H2P9
Content-Disposition: form-data; name=«file2»; filename=""
Content-Type: application/octet-stream

------WebKitFormBoundaryjtkXVNw9YVG1H2P9--

Я пытался различными способами сгенирировать аналогичный запрос различными вариантами, и остановился на таком, но пока «танцы с бубнами» не дают результатов.

Map<String, String> responseMap= new HashMap<String, String>();
    String key1 = "------WebKitFormBoundary9A3GpeDAwfa0TBDK\r\n" +
         "Content-Disposition: form-data; name=\"text\"\r\n\r\n";
    String value1 = "text default";
    headersMap.put(key1, value1);

    String key2 = "\r\n------WebKitFormBoundary9A3GpeDAwfa0TBDK\r\n" +
        "Content-Disposition: form-data; name=\"doc_sma_ref_file\"; filename=\"\"" +
        "\r\nContent-Type: application/octet-stream\r\n\r\n";
    String value2 = "";
    headersMap.put(key2, value2);

    String key3 = "\r\n------WebKitFormBoundary9A3GpeDAwfa0TBDK\r\n" +
        "Content-Disposition: form-data; name=\"doc_val_ref_file\"; filename=\"\"" +
        "\r\nContent-Type: application/octet-stream\r\n\r\n";
    String value3 = "";
    headersMap.put(key3, value3);
    
    String key4 = "\r\n------WebKitFormBoundary9A3GpeDAwfa0TBDK--";
    String value4 = "";
    headersMap.put(key4, value4);

    Connection.Response resBGT = Jsoup.connect(URL)
        .header("Content-Type", "multipart/form-data; boundary=----WebKitFormBoundary9A3GpeDAwfa0TBDK")
        .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36")
        .followRedirects(true)
        .data(responseMap)
        .cookies(cookies)
        .ignoreHttpErrors(true)
        .timeout(15000)
        .method(Connection.Method.POST)
        .execute();


Возможно у кого-то есть опыт в данном вопросе. Если вас не затруднит направьте на путь истинный.
Также возможно, есть способ перехватить запрос сгенирированный JSOUP, что впринципе также позволило бы продвинутся дальше.

Спасибо
  • ,

Google API для вычисления расстояния между 2 городами.

Приветствую. Нужно сделать простую программу с использованием Google API для вычисления расстояния между 2 городами.
Никогда с этой темой не сталкивался, может быть кто знаком — посоветуйте какие нибудь источники, где что почитать, посмотреть…
Буду рад любой помощи.